Ogni passo sono 0.9° e mi aspetto che partendo da una posizione nota , dopo 200 step abbia compiuto un angolo di 180°.
Invece le bastano 110 passi per compiere una rotazione di 180° come se ogni passo fosse 1,6°
Sto pilotando il motorino in questo modo
void motorR(){
int bitMask=B00001111; // maschera per modificare solo gli ultimi 4 bit
for (int id = 0; id <4; id++) {
PORTB = (PORTB &~bitMask) | modeR[id];
Serial.println(id);
while (tmp2++<12000);
tmp2=0;
}
}
void motorF(){
int bitMask=B00001111; // maschera per modificare solo gli ultimi 4 bit
for (int id = 0; id <4; id++) {
PORTB = (PORTB &~bitMask) | modeF[id];
Serial.println(id);
while (tmp2++<12000);
tmp2=0;
}
}
void cerca() {
passi = negativoP; //inizializza passi
while (1)
{
if(distance > MAX_DISTANCE && !foundObj) passi = negativoP;
else if (!foundObj){
foundObj = 1; // ho trovato un oggetto
}
while (passi<positivoP && distance > MAX_DISTANCE) // escursione da sinistra a destra ( da -passi a +passi).Si ferma se vede un ostacolo all'interno del raggio d'azione
{
if (passi<0) motorF(); // se proviene da sinistra e raggiunge lo zero , si sposta verso destra
else motorR();
passi++;
}
foundObj = 0;
}
}
Ciao per spiegarmi meglio ho creato questa immagine
Sembra che il motorino faccia più di un passo per volta.
Ruota per 180° se gli faccio fare 110 passi . Quello che vorrei io e farlo ruotare di 180° con 200 passi
il ciclo for lo ripetto 55 volte per poi fare l'OR con modeF[] e quindi cambiare direzione e riperlo ancora
55 volte
Di seguito il programma compilabile per testare il motorino
#define negativoP -55
#define positivoP 55
#define Speed 7500
int motorPin1 = 11;
int motorPin2 = 10;
int motorPin3 = 9;
int motorPin4 = 8;
int passi;
unsigned int tmp2;
byte modeR[] = {B00001001, B00001010, B00000110, B00000101};
byte modeF[] = {B00000101, B00000110, B00001010, B00001001};
void setup() {
Serial.begin(115200); //Opens serial connection at 9600 baud.
passi = negativoP;
pinMode(11,OUTPUT);
pinMode(10,OUTPUT);
pinMode(9,OUTPUT);
pinMode(8,OUTPUT);
pinMode(3,OUTPUT);
pinMode(2,OUTPUT);
digitalWrite(2,HIGH);
digitalWrite(3,HIGH);
}
void loop()
{
while (Serial.available())
{
char cmd = (char)Serial.read();
if (cmd == 's') while(1) cerca();
}
}
void motorR(){
int bitMask=B00001111; // maschera per modificare solo gli ultimi 4 bit
for (int id = 0; id <4; id++) {
PORTB = (PORTB &~bitMask) | modeR[id];
while (tmp2++<Speed);
tmp2=0;
}
}
void motorF(){
int bitMask=B00001111; // maschera per modificare solo gli ultimi 4 bit
for (int id = 0; id <4; id++) {
PORTB = (PORTB &~bitMask) | modeF[id];
while (tmp2++<Speed);
tmp2=0;
}
}
void cerca() {
passi = negativoP; //inizializza passi
while (1)
{
while (passi<positivoP) // escursione da sinistra a destra ( da -passi a +passi)
{
if (passi<0) motorF(); // se proviene da sinistra e raggiunge lo zero , si sposta verso destra
else motorR();
Serial.println(passi);
passi++;
}
}
}
cam9500:
Ciao, sei certo di quanti passi/giro è il motore?
Tra l'altro la sequenza mi ha incuriosito, con 2 positivi dovresti avere una sorta di mezzo step...: ti rimando a questo link Motore passo passo. Come usare un motore stepper l298n
Stefano
Si c'e scritto
Sankyo MSJC400A11 0.9 deg/step
Ma ammetto che sto andando un pò in confusione.
Il motore gira in modo fluido senza intoppi
EDIT: sto pilotando 4 passi per volta. Ho seguito il tuo link ma continua ad andare a 4 passi.
devo aver fatto qualche errore nel programma