树莓派通过I2C总线控制Arduino点亮LED灯



上一篇博客写了树莓派和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。

 

 

 


 

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用ROS控制Arduino点亮LED,需要进行以下步骤: 1. 在Arduino上连接一个LED和一个电阻器。将LED的一个引脚连接到Arduino的数字引脚(例如D13),将另一个引脚连接到电阻器,然后将电阻器的另一端连接到Arduino的GND引脚。 2. 在Arduino IDE中编写一个简单的程序,使LED在接收到来自ROS的指令时点亮或熄灭。例如,以下代码将LED连接到D13引脚,并通过ROS订阅名为“led”的主题来控制: ``` int ledPin = 13; bool ledState = false; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(ledPin, LOW); rosInit(); } void loop() { rosSpinOnce(); } void ledCallback(const std_msgs::Bool& msg) { ledState = msg.data; digitalWrite(ledPin, ledState ? HIGH : LOW); } void rosInit() { // 初始化ROS节点 int argc = 0; char** argv = NULL; ros::init(argc, argv, "arduino_led"); // 创建ROS节点句柄 nh = new ros::NodeHandle(); // 创建ROS订阅者 sub_led = nh->subscribe("led", 1, ledCallback); } void rosSpinOnce() { // 处理ROS消息 ros::spinOnce(); } ``` 3. 在ROS中创建一个名为“led”的主题,并使用rostopic命令向其发送消息以控制LED。例如,以下命令将LED点亮: ``` rostopic pub /led std_msgs/Bool "data: true" ``` 4. 检查Arduino串口输出,确保它接收到了来自ROS的消息并正确地控制LED。例如,如果使用Serial.println()语句在Arduino程序中输出调试信息,则可以使用Serial Monitor查看这些信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值