上一篇博客写了树莓派和Arduino通过I2C总线进行通信[树莓派(pi3)和Arduino之间用I2C总线通信](http://blog.csdn.net/u010667011/article/details/61922127)
书接上文,今天说一个简单的pi和Arduino通信的实例,树莓派通过I2C控制Arduino点亮LED灯。
树莓派和Arduino之间怎么连线见上一篇博客。准备好面包板,LED灯,电阻。连线如下图所示:
图片来源:http://www.51hei.com/bbs/dpj-41337-1.html
Arduino代码如下:
#include <Wire.h>
#define SLAVE_ADDRESS 0x55
int led = 13; // 定义针脚号,数字类型为整型
int number ;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(receiveData);//从机 接收 主机 发来的数据
Wire.onRequest(sendData); //从机 请求 主机 发送数据
Serial.println("OK......");
}
void loop() {
delay(1000);
}
void receiveData(int byteCount){
while(Wire.available()) {
number = Wire.read();
Serial.print("command received: ");
Serial.println(number);
if (number >= 125)
digitalWrite(13, LOW); // set the LED on
else{
digitalWrite(13, HIGH);
}
}
}
void sendData(){
Wire.write(number);
}
上次树莓派端用的是python,这次改为C代码,用到了树莓派的wiringPiI2C库。
#include <stdio.h>
#include <wiringPiI2C.h>
int main(void)
{
int value,back_val;
const int devId = 0x55;
int fd = wiringPiI2CSetup(devId);
if (fd < 0) {
printf("Error setup I2C device %d\n", devId);
return 1;
}
while(1){
printf("please enter a number(0-255):\n");
scanf("%d",&value);
wiringPiI2CWrite(fd,value);
printf("RPI:Hello Arduino ,I send a digital %d\n",value);
back_val=wiringPiI2CRead(fd);
printf("back_val=%d\n",back_val);
}
return 0;
}
在树莓派命令行下运行程序,不要忘了加上 -lwiringPi
程序的功能是:树莓派向Arduino发送一个数字命令,Arduino判断这个数字的大小,大于等于125则将13号引脚置为低电平,否则就是高电平点亮LED。