Hola tengo probles con este codigo .Controlo un robot a traves de monitor serial con rasberry y arduino uno, avanza y retrocede pero no responden los giros izquierda o derecha. Soy novato en esto disculpen y gracias por cualquier salvavidas.
#include <Servo.h>
#define enPin 8
#define lDir 5
#define lStep 2
#define rDir 6
#define rStep 3
int stepDelay = 700;
bool containerOpen = false;
Servo lid;
void step(bool dir, int dirPin, int stepPin){
digitalWrite(dirPin, dir);
digitalWrite(stepPin, HIGH);
delayMicroseconds(stepDelay);
digitalWrite(stepPin, LOW);
delayMicroseconds(stepDelay);
}
void front(int distance){
int steps = 300*distance/23;
for (int i = 0; i<steps; i++){
step(true, lDir, lStep);
step(true, rDir, rStep);
}
}
void back(int distance){
int steps = 300*distance/23;
for (int i = 0; i<steps; i++){
step(false, lDir, lStep);
step(false, rDir, rStep);
}
}
void left(int angle){
int steps = 300*angle/23;
for (int i = 0; i<steps; i++){
step(true, lDir, lStep);
step(true, rDir, rStep);
}
}
void right(int angle){
int steps = 300*angle/23;
for (int i = 0; i<steps; i++){
step(true, lDir, lStep);
step(true, rDir, rStep);
}
}
void openContainer(){
lid.write(100);
}
void closeContainer(){
lid.write(10);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
lid.attach(9);
pinMode(enPin, OUTPUT);
pinMode(lStep, OUTPUT);
pinMode(lDir, OUTPUT);
pinMode(rStep, OUTPUT);
pinMode(rDir, OUTPUT);
digitalWrite(enPin, LOW); //pulled LOW to enable drivers
}
void loop() {
// put your main code here, to run repeatedly:
if (Serial.available() > 0){
char data = Serial.read();
if (data == '1') front(40);
else if (data == '2') left(5);
else if (data == '3') right(5);
else if (data == '4') back(40);
else if (data == '5') openContainer();
else if (data == '6') closeContainer();
}
}
Tus rutinas para avanzar retroceder no difieren mucho de left y right de modo que la única diferencia visible esta en el valor que envias.
Girar a izquierda o a derecha no se puede hacer con un solo motor a menos que el servo controle el giro y el motor solo se mueva hacia adelante como estas haciendo. No veo control de servo coincidente con el movimiento izquierda o derecha.
Los giros se hacen con dos motores, uno se mantiene en la posición y el otro gira.
primero muchas gracias por responder tan pronto. si entiendo bien tenndria que cambiar true y false segun corresponda. Me quedaria algo asi
}
void left(int angle){
int steps = 300*angle/23;
for (int i = 0; i<steps; i++){
step(true, lDir, lStep);
step(false, rDir, rStep);
}
}
void right(int angle){
int steps = 300*angle/23;
for (int i = 0; i<steps; i++){
step(false, lDir, lStep);
step(true, rDir, rStep);
}
}
Prueba a ver de ese modo.
Perfecto ahora gira como un bailarin :). otra consulta se supone que deberia haber una funcion para detener el robot a traves de un sensor ultrasonido. no lo veo en el script. donde deberia colocarlo para que ante una distancia determinada se detenga y/o gire . gracias
Usa la librería NewPing.h y solo ponlo al comenzar el loop.
Lee la distancia y si es menor a determinado valor lo detienes
este simple código resuelve tu problema
#include <NewPing.h>
#define TRIGGER_PIN 12 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 11 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
void setup() {
Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
}
void loop() {
int distancia;
delay(50); // Lee cada 50 mseg
distancia = sonar.ping() /US_ROUNDTRIP_CM;
if (distancia < 50 ) {
Serial.print(distancia);
Serial.println("cm");
// detener ruedas.
}
// resto del código
}
Hola olvide decir que utilizo un shield cnc con el arduino uno el trig del sensor lo conecto a X+ y echo a Y+ del shield como los defino en el script. espero ser claro en la consulta gracias