Sto cercando di rimodernare un mio robottino e volevo mettere i due IR collegati all'ingresso interrupt 0 e 1 per il blocco dei motori con ostacolo avanti o dietro.
il listato iniziale è questo
// Test Wall_E
#include "Ultrasonic.h"
#include <Wire.h>
#include <Arduino.h>
#include <OneWire.h>
#include <Servo.h>
// Servocomandi
Servo dxservo; // crea l'oggetto servo braccio destro
Servo suservo; // crea l'oggetto servo movimento verticale testa
Servo girservo; // crea l'oggetto servo movimento orizzontale testa
int pos1 = 10; // variable e posizione iniziale del servo
int pos2 = 80; // variable e posizione iniziale del servo
int pos3 = 75; // variable e posizione iniziale del servo
//faretto e led1 retro
int lux = 0;
int led1 = 4;
int led2 = 18;
int led3 = 19;
//motore A
int enA = 6;
int in1 = 7;
int in2 = 8;
//motore B
int enB = 11;
int in3 = 12;
int in4 = 13;
// variabili lettura Ultrasonic
Ultrasonic ultrasonic(16, 17);
int val = 0;
int valdx = 0;
int valsx = 0;
// variabili gestione interrupt
int irav;
int irrt;
int blok;
int bat;
int a = 0;
//===*****============================*****====================
void setup()
{
Serial.begin(9600);
Wire.begin();
attachInterrupt(0, vai_indietro, FALLING);
attachInterrupt(1, vai_avanti, FALLING);
dxservo.attach(5); // dichiaro il servo collegato al pin 5
suservo.attach(9); // dichiaro il servo collegato al pin 10
girservo.attach(10); // dichiaro il servo collegato al pin 11
dxservo.write(pos1); //metto il servo nella posizione iniziale
suservo.write(pos2); //metto il servo nella posizione iniziale
girservo.write(pos3); //metto il servo nella posizione iniziale
//imposta i pin
pinMode (enA, OUTPUT);
pinMode (in1, OUTPUT);
pinMode (in2, OUTPUT);
pinMode (enB, OUTPUT);
pinMode (in3, OUTPUT);
pinMode (in4, OUTPUT);
pinMode (led1, OUTPUT); // led1 frontale
pinMode (led2, OUTPUT); // led1 retro
pinMode (2, INPUT); // gestione interrupt avanti
pinMode (3, INPUT); // gestione interrupt retro
digitalWrite(enA, LOW);
digitalWrite(enB, LOW);
led1OnOff();
}
//===*****============================*****====================
void loop()
{
Serial.println(" LOOP_LOOP ");
Serial.println(" LOOP_LOOP ");
batteria();
delay(3000);
}
//===*****============================*****====================
void vai_indietro() {
Serial.println(" INTERRUPT AVANTI ");
delay(1500);
noInterrupts();
irav = digitalRead(2);
irrt = digitalRead(3);
if (irav < 1 && irrt > 0) {
alt();
retro();
}
if (irav < 1 && irrt < 1) {
blocco();
}
delay(3000);
}
//===*****============================*****====================
void vai_avanti() {
Serial.println(" INTERRUPT RETRO ");
delay(1500);
noInterrupts();
irav = digitalRead(2);
irrt = digitalRead(3);
if (irav > 0 && irrt < 1) {
alt();
go();
}
if (irav < 1 && irrt < 1) {
blocco();
}
}
//===*****============================*****====================
void go() {
Serial.println(" MOTORI AVANTI ");
digitalWrite(enA, 100);
digitalWrite(enB, 100);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in1, HIGH);
Serial.println(" IMPOSTATO MOTORI AVANTI ");
delay(100);
}
//===*****============================*****====================
void retro() {
Serial.println(" MOTORI INDIETRO ");
digitalWrite(enA, 50);
digitalWrite(enB, 50);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in1, LOW);
Serial.println(" IMPOSTATO MOTORI INDIETRO ");
delay(1500);
Serial.println(" FINE MANOVRA ");
delay(500);
}
//===*****============================*****====================
void alt() {
//alt i motori
Serial.println("ALT MOTORI");
digitalWrite (in1, LOW);
digitalWrite (in2, LOW);
digitalWrite (in3, LOW);
digitalWrite (in4, LOW);
Serial.println(" == MOTORI FERMI == ");
delay(1000);
}
//===*****============================*****====================
void blocco() {
//alt i motori
Serial.println("ALT MOTORI");
digitalWrite (in1, LOW);
digitalWrite (in2, LOW);
digitalWrite (in3, LOW);
digitalWrite (in4, LOW);
Serial.println(" == NON HO SPAZIO == ");
delay(1000);
}
//=======================================================================================
void led1OnOff() {
//accendo o alt luce in relazione luminosità ambiente
lux = analogRead(0);
if (lux < 40) {
digitalWrite (led1, HIGH); Serial.println("poca luce, accendo il faro ");
}
else {
digitalWrite (led1, LOW); Serial.println("luce ok, il faro non serve ");
}
}
//=======================================================================================
void batteria() {
//accendo o alt luce in relazione luminosità ambiente
bat = analogRead(1);
if (bat < 970) {
Serial.println("BATTERIA BASSA ");
alt();
}
}
//=======================================================================================
e mi sembrava fosse semplice implementarli ma poi facendo un test con un semplice cartoncino ho visto questo
luce ok, il faro non serve
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
INTERRUPT AVANTI
ALT MOTORI
== MOTORI FERMI ==
MOTORI INDIETRO
IMPOSTATO MOTORI INDIETRO
FINE MANOVRA
INTERRUPT AVANTI
ALT MOTORI
== MOTORI FERMI ==
MOTORI INDIETRO
IMPOSTATO MOTORI INDIETRO
FINE MANOVRA
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
INTERRUPT AVANTI
INTERRUPT AVANTI
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
LOOP_LOOP
avevo una doppia risposta e nonostante l'interrupt fosse in FALLING togliendo il cartoncino mi dava due segnali per fortuna senza comandi.
il LOOP_LOOP l'ho messo per evidenziarmi dove mi trovo.
Qualcuno sa dirmi dove sbaglio?