Salve a tutti, sto lavorando ad un progetto di un semplice veicolo "autonomo", un piccolo autobus che deve girare in un plastico, per muoversi usa un semplice codice con dei line follower per lo sterzo e un sensore di distanza per farlo muovere o per fermarsi in caso di ostacolo;
Da un po' ho aggiunto un arduino mega al plastico, che comunica via radio con l'arduino nel veicolo, per ora ci sono dei sensori magnetici nel plastico, che, se attivati da una calamita posta sotto al pianale dell'autobus, lo fanno fermare, mandando lo stato del sensore via radio.
Dato che alcuni sensori sono posti vicino a dei semafori, vorrei che il dato del sensore magnetico fosse mandato solo se la luce rossa del semaforo e' accesa, cosi' facendo l'autobus si fermerebbe solo se il semaforo e' rosso.
Il problema e' che non riesco a far funzionare il modulo radio MENTRE il semaforo fa il suo lavoro, mi spiego: se nel [void loop] del codice c'e' solo il sistema radio per i sensori, allora non ci sono problemi tutto lavora come descritto, se io invece inserisco anche un piccolo loop per il semaforo(cioe' tipo led rosso high, led verde low, delay tot secondi, led rosso low, led verde high, delay tot secondi) il modulo radio sembra non mandare dati o comunque li manda solo dopo al loop del semaforo;
Posto qui sotto i codici di entrambi, essendo in fase di test c'e' solo un sensore magnetico, e solo il led rosso.
Plastico:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte addresses[6] = "Free1";
const int sm1 = 30;
int dataWrite[1];
int statsm1;
int SaR = 20;
void setup() {
radio.begin();
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_1MBPS);
radio.setRetries(0, 15);
radio.openWritingPipe(addresses);
radio.stopListening();
pinMode(sm1, INPUT);
pinMode(SaR, OUTPUT);
}
void loop() {
digitalWrite(SaR, HIGH);
delay(2000);
digitalWrite(SaR, LOW);
delay(2000);
statsm1 = digitalRead(sm1);
dataWrite[0] = statsm1;
radio.write(dataWrite, sizeof(dataWrite));
}
Autobus:
//-----------------------------------------------------------
//--------------------- sistema sterzo ----------------------
//-----------------------------------------------------------
#include <Servo.h>
int sd = 3;
int ss = 2;
Servo sterzo;
int pos = 90;
//-----------------------------------------------------------
//--------------------- sistema motore ----------------------
//-----------------------------------------------------------
#include <HCSR04.h>
int triggerPin = 10;
int echoPin = 9;
const int avanti = 4;
const int indietro = 5;
UltraSonicDistanceSensor distanceSensor(triggerPin, echoPin);
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
RF24 radio(7, 8); // CE, CSN
const byte addresses[6] = "Free1";
int dataRead[1];
void setup() {
pinMode(avanti , OUTPUT);
pinMode(indietro , OUTPUT);
pinMode(sd, INPUT);
pinMode(ss, INPUT);
sterzo.attach(6);
Serial.begin(9600);
radio.begin();
radio.setPALevel(RF24_PA_MIN);
radio.setDataRate(RF24_1MBPS);
radio.setRetries(0, 15);
radio.openReadingPipe(1, addresses);
radio.startListening();
}
void loop() {
//-------------------------------------------------------------
//-------------------- controllo sterzo -----------------------
//-------------------------------------------------------------
if(digitalRead(ss) && digitalRead(sd)){
sterzo.write(90);
}
if(!(digitalRead(ss)) && !(digitalRead(sd))){
sterzo.write(90);
}
if(!(digitalRead(ss)) && digitalRead(sd)){
sterzo.write(120);
}
if(digitalRead(ss) && !(digitalRead(sd))){
sterzo.write(60);
}
//-------------------------------------------------------------
//-------------------- controllo marcia -----------------------
//-------------------------------------------------------------
double distance = distanceSensor.measureDistanceCm();
Serial.println(distance);
delay(10);
if(distance > 5){
if( radio.available()) {
radio.read(dataRead, sizeof(dataRead));
if(dataRead[0] == LOW){
digitalWrite(avanti, LOW);
digitalWrite(indietro, LOW);
}
if(dataRead[0] == HIGH){
digitalWrite(avanti, HIGH);
digitalWrite(indietro, LOW);
}
}
}
else if(distance < 5){
digitalWrite(avanti, LOW);
digitalWrite(indietro, LOW);
}
Serial.println(dataRead[0]);
}
Come potrei risolvere?