我正在尝试一个I²C设置,其中一个主Arduino控制两个从设备.

我在I²C上使用两个2000欧姆上拉电阻,所有电路板都是Arduino Duemilanoves.I²C设置和控制设置在彼此断开连接时都能正常工作,但连接后,只要wire.write调用第一个功能,Arduinos就会无响应.我停止接收串行消息,从属Arduinos停止接收来自主设备的消息,并且我无法使用按钮打开和关闭系统.
我尝试在每个wire.write功能之后添加短延迟,并尝试使用各种上拉电阻来解决问题,但似乎没有任何效果.我怎样才能解决这个问题?
主码:
#include <Wire.h>
int potPin1 = 0; // Select the input pin for the potentiometer
int potPin2 = 1;
int potVal1; // Variable to store the value coming from the sensor
int potVal2;
int times=0; // All the below variables are used to control an on-off button
int state=0;
int lastState=0;
boolean pot=false;
void setup()
{
pinMode(13, OUTPUT); //LED that turns on when system is activated
pinMode(3, INPUT); //Button that turns on system
Serial.begin(9600);
Wire.begin();
}
void loop(){
state=digitalRead(3);
if(state != lastState){
if(state==HIGH){
times++;
Serial.println(times);
}
else{
Serial.println("off");
}
}
lastState=state;
if(times%2 ==1)
{
turnPotOn();
}
else
{
turnPotOff();
}
Run Code Online (Sandbox Code Playgroud)
//此循环中的所有代码在按下按钮时打开和关闭系统.//以下代码对应I²C,基于电位计读数.
if(pot==true)
{
potVal1 = analogRead(potPin1); // Read the value from the sensor
potVal2 = analogRead(potPin2);
if((potVal1>700) && (300<potVal2) && (potVal2<700))
{
arduino1_motor1();
}
else if ((potVal1<330) && (336<potVal2) && (potVal2<683))
{
arduino1_motor2();
}
else if ((potVal2>683) && (330<potVal1) && (potVal1<640))
{
arduino2_motor3();
}
else if ((potVal2<336) && (330<potVal1) && (potVal1<640))
{
arduino2_motor4();
}
else if ((potVal2<336) && (potVal1<330))
{
arduino12_motor24();
}
else if ((potVal2>683) && (potVal1>640))
{
arduino12_motor23();
}
else if ((potVal2>683) && (potVal1<640))
{
arduino11_motor23();
}
else if ((potVal2<336) && (potVal1>330))
{
arduino11_motor24();
}
else
{
arduino12_still();
}
}
else
{
// arduino1_still();
// arduino2_still();
Serial.println("OFF");
}
}
void turnPotOff()
{
digitalWrite(13, LOW);
pot=false;
}
void turnPotOn()
{
digitalWrite(13, HIGH);
pot=true;
}
void arduino1_motor1()
{
Wire.beginTransmission(5);
Wire.write('A');
Wire.endTransmission();
arduino2_still();
Serial.println("A1 in M1 d");
}
void arduino1_motor2()
{
Wire.beginTransmission(5);
Wire.write('B');
Wire.endTransmission();
arduino2_still();
Serial.println("A1 in m2 d");
}
void arduino12_still()
{
arduino1_still();
arduino2_still();
Serial.println("A1 & A2 stl");
}
void arduino2_motor3()
{
arduino1_still();
Wire.beginTransmission(10);
Wire.write('M3');
Wire.endTransmission();
Serial.println("A2 in M3 d");
}
void arduino2_motor4()
{
arduino1_still();
Wire.beginTransmission(10);
Wire.write('D');
Wire.endTransmission();
Serial.println("A2 in M4 d");
}
void arduino12_motor24()
{
Wire.beginTransmission(5);
Wire.write('B');
Wire.endTransmission();
Wire.beginTransmission(10);
Wire.write('D');
Wire.endTransmission();
Serial.println("A1 & A2 in M2 and M4 d");
}
void arduino12_motor23()
{
Wire.beginTransmission(5);
Wire.write('B');
Wire.endTransmission();
Wire.beginTransmission(10);
Wire.write('C');
Wire.endTransmission();
Serial.println("A1 & A2 in M2 and M3 d");
}
void arduino11_motor24()
{
Wire.beginTransmission(5);
Wire.write('A');
Wire.endTransmission();
Wire.beginTransmission(10);
Wire.write('D');
Wire.endTransmission();
Serial.println("A1 & A2 in M1 and M4 d");
}
void arduino11_motor23()
{
Wire.beginTransmission(5);
Wire.write('A');
Wire.endTransmission();
Wire.beginTransmission(5);
Wire.write('C');
Wire.endTransmission();
Serial.println("A1 & A2 in M1 and M3 d");
}
void arduino1_still()
{
Wire.beginTransmission(5);
Wire.write('S');
Wire.endTransmission();
}
void arduino2_still()
{
Wire.beginTransmission(10);
Wire.write('S');
Wire.endTransmission();
}
Run Code Online (Sandbox Code Playgroud)
奴隶1代码:
#include <Servo.h>
#include <Wire.h>
Servo myservo1;
Servo myservo2;
void setup()
{
Serial.begin(9600); // setup serial
myservo1.attach(2);
myservo2.attach(3);
Wire.begin(5);
Wire.onReceive(receiveEvent);
}
void loop()
{
}
void receiveEvent(int howMany)
{
while(Wire.available())
{
char v = Wire.read();
if(v == 'A')
{
myservo1.write(0);
myservo2.write(180);
Serial.println("Arduino 1 in motor 1 direction");
}
else if(v == 'B')
{
myservo1.write(180);
myservo2.write(0);
Serial.println("Arduino 1 in motor 2 direction");
}
else
{
myservo1.write(90);
myservo2.write(85);
Serial.println("Arduino 1 still");
}
}
}
Run Code Online (Sandbox Code Playgroud)
奴隶2:
#include <Servo.h>
#include <Wire.h>
Servo myservo3;
Servo myservo4;
void setup()
{
Serial.begin(9600); // Setup serial
myservo3.attach(2);
myservo4.attach(3);
Wire.begin(10);
Wire.onReceive(receiveEvent);
}
void loop()
{
}
void receiveEvent(int howMany)
{
while(Wire.available())
{
char v = Wire.read();
if(v == 'C')
{
myservo3.write(0);
myservo4.write(180);
Serial.println("Arduino 2 in motor 3 direction");
}
else if(v == 'D')
{
myservo3.write(180);
myservo4.write(0);
Serial.println("Arduino 2 in motor 4 direction");
}
else
{
myservo3.write(90);
myservo4.write(90);
Serial.println("Arduino 2 still");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这可能会对您有所帮助:
好吧,这将是一堵文字墙,我在发帖之前已经不小心关闭了标签一次,所以我可能听起来很生气,因为 Arduino 的这个“功能”真的很糟糕,如果你插入一个,它会花费你 $$ 3.3v设备插入即可。您使用的 Wire Library 在 SDA 和 SCL 引脚上启用了非常糟糕的 20k 内部上拉电阻。
在每个 ARDUINO 上。您遇到的情况是总上拉电阻现在被破坏(搞砸了)。您需要研究如何禁用内部上拉电阻。我建议修改库。出于整体原因,这种控制永远不应该在软件中完成。仔细检查他对所需外部上拉电阻的数学计算。Arduino 上每个 SCL/SDA 引脚的电容应为 10pF。
这是直接来自 ATMEGA 数据表的公式
https://i.stack.imgur.com/YAZds.png
这是 ATMEGA 数据表,请参阅第 21 节了解 I2C 部分
http://www.atmel.com/Images/doc8161.pdf
| 归档时间: |
|
| 查看次数: |
5348 次 |
| 最近记录: |