Ведомый для отправки данных после получения команды с использованием I2C
Я хочу, чтобы мой ведомый Arduino отправлял сигнал ведущему устройству после выполнения команды. Но ведомый Arduino не приступает к отправке сигнала после выполнения команды. Что не так с моим кодом?
Подчиненный
void receiveEvent(int bytes) {
dir = Wire.read(); // направление
dis = Wire.read(); // расстояние
spe = Wire.read(); // скорость
eStop = Wire.read(); // 1 или 0
Serial.println(dir);
Serial.println(dis);
Serial.println(spe);
mov = true;
}
void loop() {
Wire.onReceive(receiveEvent);
if (dir == 1 && mov == true && eStop == false){
motor.Distance(dis);
motor.Speed(spe);
motor.Forward();
Wire.onRequest(requestEvent);
mov = false;
fin = true;
}
if (dir == 2 && mov == true && eStop == false){
motor.Distance(dis);
motor.Speed(spe);
motor.Reverse();
Wire.onRequest(requestEvent);
mov = false;
fin = true;
}
else{
motor.Stop();
}
}
void requestEvent(){
Wire.write(1);
fin = false;
Serial.println("sent");
}
Мастер
#include <Wire.h>
const byte interruptPin = 2;
byte dir = 0;
byte dis;
byte spe;
bool upd;
bool state= false;
void setup() {
Wire.begin();
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), emergencyStop, CHANGE);
Serial.begin(9600);
}
void loop() {
if( state == false ){
dir = 1;
dis = 30;
spe = 2;
Wire.beginTransmission(9); // передать на устройство №9
Wire.write(dir);
Wire.write(dis);
Wire.write(spe);
Wire.write(0);
Wire.endTransmission(); // прекращаем передачу
state = true;
}
if (state == true){
if(Wire.available() > 0){
Wire.requestFrom(9,2); //6 байт от ведомого 9
bool upd = Wire.read();
Serial.println(upd);
}
}
}
void emergencyStop(){ // не работает
Wire.beginTransmission(9); // передать на устройство №9
Wire.write(0);
Wire.write(0);
Wire.write(0);
Wire.write(1);
Wire.endTransmission(); // прекращаем передачу
}
1 ответ
▲ 1
нашел свое решение для этого. хотя еще не проверено, но я удалил серийную печать и переместил Wire.onRequest за пределы цикла if. и использует ledPin для проверок
void loop() {
Wire.onReceive(receiveEvent);
Wire.onRequest(requestEvent);
if (dir == 1 && mov == true && eStop == false){
motor.Distance(dis);
motor.Speed(spe);
motor.Forward();
mov = false;
fin = true;
}
if (dir == 2 && mov == true && eStop == false){
motor.Distance(dis);
motor.Speed(spe);
motor.Reverse();
mov = false;
fin = true;
}
else{
motor.Stop();
}
}
void requestEvent(){
if ( fin == true){
Wire.write(1);
fin = false;
digitalWrite(ledPin, HIGH);
}
}
,
@Julius Noel Banayo
Да, вы не должны выполнять серийную печать внутри процедуры обслуживания прерывания., @Nick Gammon
Смотрите также:
- Путаница между SPI и I2C для SSD1306 OLED
- Отправка строки из RPi в Arduino - Рабочий код
- ШИМ-сигнализация с Arduino: для чего использовать землю?
- Как отправлять и получать данные с Arduino Uno на Arduino Mega с помощью I2C?
- Проблемные данные I2C к датчику GY955/BNO055 (Китай)
- Как подключить несколько акселерометров MMA8451 (протокол I2C) с помощью одного Arduino Mega
- Преобразование float в байт, от Arduino до Raspberry Pi i2c
- Код I2C работает на Mega 2560, но не на Uno и nano
Пожалуйста, отредактируйте свой вопрос, чтобы включить полный скетч, @chrisl
Обычно Wire.onReceive(callbackFunction) вызывается один раз в setup()., @Mikael Patel
Последовательная печать в функции обратного вызова может вызвать проблемы., @Mikael Patel