Ciao a tutti eccomi quì di nuovo a riprendere un mio progetto passato.
Dopo aver fatto muovere un passo passo a mio piacimento come un intervalluino ora vorrei muoverlo a comando premento un pulsante ,cioè se premo il pulsante 1 il motore va alla velocità stabilita in direzione Destra se premo il pulsante 2 va a Sinistra se non premo nulla resta fermo
Nel codice che uso ora se è in positovo va a dx (rotateDeg(3000, 2);)se è negativo va a sinistra(rotateDeg(-3000, 2);
Il codice che uso è questo vorrei capire come e dove scrivere una riga di comando per l'azionamento
Vi ringrazio in anticipo
int DIR_PIN_M1 =7;
int STEP_PIN_M1 =5;
int SLEEP = 6; // PIN 12 = SLP
//motore 2
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;
void setup() {
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);
}
void loop(){
//specifica numero giri e tempo di attesa
rotateDeg(-3000, 2);
delay(000);
}
void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);
int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN_M1, LOW);
delayMicroseconds(usDelay);
}
}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);
digitalWrite(DIR_PIN_M2,dir);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN_M2, LOW);
delayMicroseconds(usDelay);
}
}
interessa anche a me la cosa, appena posso provo il tuo codice o ne faccio uno mio, anche a me serve premere un pulsante e far girare il motorino finche' il pulsante e' premuto, ho appena iniziato a provare i passopasso
se si tratta solo di prendere in input dati da tastiera allora la cosa diventa cosi'
if (Serial.available() > 0) {
int inByte = Serial.read();
// do something different depending on the character received.
// The switch statement expects single number values for each case;
// in this exmaple, though, you're using single quotes to tell
// the controller to get the ASCII value for the character. For
// example 'a' = 97, 'b' = 98, and so forth:
switch (inByte) {
case 'a':
//code for a
break;
case 'b':
//code for b
break;
case 'c':
//code for c
break;
case 'd':
//code for d
break;
case 'e':
//code for e
break;
default:
// se nessuna opzione è tra quelle prestabilite
//code
}
}
No non devo prendere imput da tastiera
ho 2 tasti con contatto chiuso aperto 0-1 collegati su 4 pin dell'arduino vorrei far girare il motore quando premo il tasto
cioè con il pin 1 si attiva (premendo il tasto) con il pin 0 resta fermo
con il secondo tasto con pin 2 si attiva verso opposto se lascio il tasto resta fermo.
Allora è ancora più semplice, te la cavi con 2 IF.
però perchè usi 4 pin per due pulsanti? basta un pin per pulsante, metti una resistenza di pull-up tipo da 10k (giusto?) tra il pin e i 5V, mentre il pulsante lo metti tra il pin e GND. praticamente quando lo schiacci il pin diventa 0.
per cui fai un:
if ( digitalRead(n_pin) == 0) {
chiamata_alla_funzione_movimento()
}
..poi ci sono modi più eleganti, ma questo è il più elementare e comprensibile.
dab77:
Allora è ancora più semplice, te la cavi con 2 IF.
però perchè usi 4 pin per due pulsanti? basta un pin per pulsante, metti una resistenza di pull-up tipo da 10k (giusto?) tra il pin e i 5V, mentre il pulsante lo metti tra il pin e GND. praticamente quando lo schiacci il pin diventa 0.
per cui fai un:
if ( digitalRead(n_pin) == 0) {
chiamata_alla_funzione_movimento()
}
..poi ci sono modi più eleganti, ma questo è il più elementare e comprensibile.
Davide.
Si giusto Davide e grazie!
ho fatto proprio così solo che non avevo il codice .
Quindi la tua stringa la dovrei inserire così?Mi da un erroreProva_pulsante_.cpp:20:20: error: invalid suffix "_pin" on integer constant
#define DIR_PIN 7 #define STEP_PIN 5
const int buttonPin = 8; //Setting button number 1 to Pin 2
int buttonState = 1; //Setting button state to off
void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN,dir);
int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *30;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN, HIGH);
delayMicroseconds(usDelay);
XD XD XD XD siete dei mitiiiiiiiiiii!!!
Funzionaaaaaaaaaaaaaaa!!!!!!!!!!
Ora però siamo a metà del lavoro ,cioè quando premo il pulsante il motore gira verso destra quando lascio si ferma
Avendo un secondo pulsante sul pin 12 come posso far cambiare direzione?
Io fino adesso cambiavo lo stato di questa stringa rotateDeg(-1000, 0.7);da positivo a negatico togliendo ed inserendo la - davanti al 1000
Come potrei fare?
Grazie infinite
int DIR_PIN_M1 =3; //7
int STEP_PIN_M1 =2; //5
int SLEEP = 6; // PIN 12 = SLP
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;
const int buttonPin = 10; //Setting button number 1 to Pin 2
int buttonState = 0; //Setting button state to off
void setup() {
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);
}
void loop(){
//specifica numero giri e tempo di attesa
if ( digitalRead(buttonPin) == 0) {
rotateDeg(-1000, 0.7);
delay(000);
}
}
void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);
int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN_M1, LOW);
delayMicroseconds(usDelay);
}
}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);
digitalWrite(DIR_PIN_M2,dir);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);
digitalWrite(STEP_PIN_M2, LOW);
delayMicroseconds(usDelay);
}
}[code*
void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);
int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);
}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);
digitalWrite(DIR_PIN_M2,dir);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);
Ora mi funzia ma non fa quello che volevo io. ]
Praticamente senza premere nessun bottone gira a destra all'infinito se premo il bottone 2 mi fa il ciclo 3000 giri da un senso e 3000 giri dall'altro ripetendolo all'infinito se rilascio il tasto 2 ritorna la rotazione a destra all'infinito.
Mi andrebbe bene se premento il tasto 1 rimanesse nella direzione sinistra ma così non è!
Come faccio a fargli cambiare direzione all'infinito?
e se possibile come faccio fargli fare una direzione tenendo premuto un pulsante e l'altra direzione con l'altro pulsante all'infinito e se non premo nulla sta fermo?
Grazie ancora
const int buttonPin = 10; //Setting button number 1 to Pin 2
int buttonState = 1; //Setting button state to off
const int buttonPin1 = 12; //Setting button number 1 to Pin 2
Ma dove sono? Hai riportato parte del codice e non è completo? Cos'è?
Dove dichiari che i buttonPin sono di INPUT?
buttonState lo dichiari e non lo usi.
void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);
int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);
}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);
digitalWrite(DIR_PIN_M2,dir);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);
però ho modificato il codice così e ci siamo quasi solo che ora il motore gira sempre all'infinito se non premo nulla a dx se premo il pulsante 1 gira a sinistra all'infinito e mi andrebbe bene anche così anche se non è molto bello per la sicurezza devo trovare il modo di farlo azionare tenendo prememuto il pulsante1 che vada a destra tenendo il pulsante 2 che vada a sinistra se lascio i due pulsanti deve stare fermo.
Non c'è il modo di dare il consenso al motore?
int DIR_PIN_M1 =3; //7
int STEP_PIN_M1 =2; //5
int SLEEP = 6; // PIN 12 = SLP
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;
const int buttonPin = 10; //Setting button number 1 to Pin 2
int buttonState = 1; //Setting button state to off
void rotateDeg(float deg, float speed){
//rotate a specific number of degrees (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (deg > 0)? HIGH:LOW;
digitalWrite(DIR_PIN_M1,dir);
int steps = abs(deg)*(1/0.225);
float usDelay = (1/speed) *70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M1, HIGH);
delayMicroseconds(usDelay);
}
void rotate_M2(int steps, float speed){
//rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
//speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
int dir = (steps > 0)? HIGH:LOW;
steps = abs(steps);
digitalWrite(DIR_PIN_M2,dir);
float usDelay = (1/speed) * 70;
for(int i=0; i < steps; i++){
digitalWrite(STEP_PIN_M2, HIGH);
delayMicroseconds(usDelay);