极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 92897|回复: 19

手把手教你树莓派与Arduino Uno的对接(USB及GPIO方式)

[复制链接]
发表于 2013-8-8 00:08:00 | 显示全部楼层 |阅读模式
关于树莓派与Arduino Uno如何对接,网络上的资料很少,经本人研究三天终于成功了,总结个教程。它们实现对接的方式至少有三种(USB方式对接、GPIO方式对接、 I2C方式对接、其他)。

本文介绍实现的也是亲测成功的前两种(USB对接,GPIO对接),本人也是初学者,老鸟可以绕道。就以初学者方式说起

一.先说必要的开发环境。

Arduino: 开发环境我是用 arduino-0023 现在是 arduino 1.0.5最新版本这 两个主要是驱别是一些库文件被改动,网络上提供的

教程一般都是以 arduino-0023 这个环境很简单,(你要是在淘宝上买Arduino UNO 卖家都会提供IDE与相应的开发教程)
IDE下载地址http://arduino.cc/en/Main/Software

Arduino与PC连接的USB驱动地址:

PL2303_Prolific_DriverInstaller_v1.8.0.zip : http://www.prolific.com.tw/US/ShowProduct.aspx?p_id=225&pcid=41

PL2303_Prolific_DriverInstaller_v1.5.0.zip : ftp://ftp.omega.com/public/DASGroup/products/OM-PL-USBS/PL2303_Prolific_DriverInstaller_v1.5.0.zip

(如果连接失效请用迅雷下载或自己百度) 以上软件x86 x64都可以安装

XP与WIN7都没问题,在WIN8 64下有可能遇到驱动无法使用问题,win8亲测可用,注意安装的时候以管理员身份win7兼容性运行,安装完成之后点击“更新驱动程序软件”才可用。



树莓派:开发环镜我用python 2.7(现在新系统都有自带这个),常用的两个库文件 RPi.GPIO与serial

1.安装python(安装过的请跳到下一步):  sudo aptitude install python-dev
2.安装python的GPIO模块,用于控制LED、电机等(安装过的请跳到下一步)
  命令行下 输入(一行一个命令)
  1. wget http://raspberry-gpio-python.googlecode.com/files/RPi.GPIO-0.3.1a.tar.gz    (下载GPIO库)
  2.   tar xvzf RPi.GPIO-0.3.1a.tar.gz  (tar解压)
  3.   cd RPi.GPIO-0.3.1a               (进入解压后的文件夹)
  4.   sudo python setup.py install     (安装GPIO库文件)
复制代码
要是看不懂上面的两点请移步到这http://www.shumeipai.net/forum.php?mod=viewthread&tid=939

  3.安装serial,用于串口通信及USB通信:
  1. sudo apt-get install python-serial
复制代码
4.当然你要是想在树莓派装串口调试工具就装:
  1. sudo apt-get install minicom   
复制代码
配置minicom
  1. sudo minicom -s     
复制代码
启动出现配置菜单:选serial port setup
进入串口配置
输入A 配置串口驱动为/dev/ttyAMA0
输入E 配置速率为9600 8N1
输入F 将 Hardware Flow Control 设 为 NO
回车 退出      
由于我们使用minicom作为超级终端控制路由器等设备, 而不是控制modem, 所以需要修改Modem and dialing, 将Init string, Reset string, Hang-up string设置为空. 设置完成后选择Save setup as dfl将当前设置保存为默认设置.    在配置菜单 选Save setup as df1保存(一定要记得这一步)   选Exit退出下次在输入minicon 即可直接进入。
命令minicom是进入串口超级终端画面,而minicom -s为配置minicom。说明/dev/ttyAMA0 对应为串口0 为你连接开发板的端口
。(如何更详细使用说明移步到这http://www.shumeipai.net/forum.php?mod=viewthread&tid=550

接下来测一下环境是否都OK
  1. sudo nano test.py
复制代码
或用xwindow下用python IDE打开一个空的文件
    输入内容
  1. import serial
  2. import RPi.GPIO
复制代码
保存退出,
    然后运行代码:
  1. python test.py
复制代码
(如果没有报错那就说明RPi.GPIO与serial两个库安装成功)上面环境说完了,重点部份来了

USB对接方式:
  1.插上两个Arduion Uno与树莓派 的USB 然后 在树莓派输入:
  1. ls /dev/tty*
复制代码
查看有没有ttyACM0 这个文件(注只有在两个硬件USB互连的情况下才会有这个。如果两者没有连接是不会有的) 最新的系统一般都会自动生成。看到ttyACMO就说明二者可以通讯了 接下来上测试代码
  Arduino代码:
  1.   byte number = 0;
  2.   void setup(){
  3.      Serial.begin(9600);
  4.   }

  5.   void loop(){
  6.     if (Serial.available())  {
  7.        number = Serial.read();
  8.        Serial.print("character recieved: ");
  9.        Serial.println(number, DEC);
  10.    }
  11.    }
复制代码
先把上面的代码下载的Arduino上然后再把两者USB互接

树莓派python代码:
  1. import serial
  2. ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
  3. ser.open()

  4. ser.write("testing")
  5. try:
  6.     while 1:
  7.              response = ser.readline()
  8.              print response
  9. except KeyboardInterrupt:
  10.     ser.close()
复制代码
保存xxx.py 退出

注:树莓派下的serial与GPIO库都要在root帐户下才能运行

然后运行树莓派代码 python xxx.py(这里的xxx就是你保存的树莓派代码)看到
  1. character recieved: 116
  2. character recieved: 101
  3. character recieved: 115
  4. ...
  5. character recieved: 103
复制代码
说明两者USB通迅成功了


GPIO方式这个高级些就是利用树莓派的pin8(GPIO14) pin10(GPIO15)与Arduion pin0(rx) pin1(tx)的进行对接
注:所需的中间硬件 逻辑电平转换器(这个淘宝上有一个5元钱)要实在没有就用两电阻也行(一个是3.3 KO 一个是1.6KO)线路怎么接后面会讲,千万不要把两个直接用电线对接。两个电压不一样会造烧坏你的Pi。


Anduino  测试代码与上面一样不用做改动

树莓派python代码改动一下就是把 ttyACM0 改为 ttyAMA0 其他的不变之后就成这样
  1. import serial
  2. ser = serial.Serial('/dev/ttyAMA0', 9600, timeout=1)
  3. ser.open()

  4. ser.write("testing")
  5. try:
  6.         while 1:
  7.         response = ser.readline()
  8.         print response
  9. except KeyboardInterrupt:
  10.        ser.close()
复制代码
接下来关键的部份把树莓派配置文件要做一下修改(要看详细的请移步这里 http://www.eeboard.com/bbs/thread-8574-1-1.html)
1.修改cmdline.txt
输入
  1. sudo nano /boot/cmdline.txt
复制代码
看到
  1. dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
复制代码
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 删除

变成这样
  1. dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
复制代码
ctrl+x 按Y保存退出

2.修改inittab 然后禁止掉从串口登录的功能,

  输入
  1. sudo nano /etc/inittab
复制代码
找到
  1. T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
复制代码
这一行 在前面加个#注释掉这一行变成
  1. #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
复制代码
ctrl+x 按Y保存退出
然后重启树莓派,之后树莓派的pin8(GPIO14) pin10(GPIO15)这两个口就可以当成普通的串口来用了 现在你可以像使用一个普通串口那样使用/dev/ttyMA0了

接下来做硬件的部份的对接
1.逻辑电平转换器方式, 这是我用的中间件(淘宝上有)






接线




树莓派的引脚说明









2用电阻对接的 (这个本人没试过,你们有条件就自己试吧,测试代码与上面的一样)










之后运行上面的python 程序,看到
character recieved: 116

character recieved: 101

character recieved: 115

...

character recieved: 103


那就说明成功了。


参考资料
(USB对接)http://blog.oscarliang.net/conne ... -arduino-usb-cable/
(I2C对接)http://blog.oscarliang.net/raspberry-pi-arduino-connected-i2c/
(GPIO对接)http://blog.oscarliang.net/raspb ... nected-serial-gpio/
(SPI对接)http://mitchtech.net/raspberry-pi-arduino-spi/


关于怎么控制LED 很简单

把LED的正级 就是针脚长的那一端接 树莓派的其中一个GPIO脚如 GPIO 17(pin11) ,LED 负极(短脚)接GND (pin6)

代码如下
  1. import RPi.GPIO as GPIO
  2. import time
  3. GPIO.setmode(GPIO.BCM) #以GPIO编号方式 要是BOARD 那下面的17改为11
  4. GPIO.setup(17,GPIO.OUT)
  5. while True:
  6.         print "set output low"
  7.        GPIO.output(17,GPIO.LOW)
  8.        time.sleep(1)
  9.        print "set output HIGH"
  10.        GPIO.output(17,GPIO.HIGH)
  11.        time.sleep(1)
复制代码
保存运行 你就能看到LED一秒闪一下了

好了就到这了,这是我一个初学者研究三天的成果。接下来看各位的了。


后面我要弄个智能小车 树莓派做上位机 + Arduino做下位机驱动硬件。PC通过WIFI 与树莓派以TCP方式进行远程通迅,控制树莓派.就等着我的好消息。。。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

发表于 2013-8-8 08:39:04 | 显示全部楼层
楼主我爱你!我的监控机终于看到成功的希望了!
回复 支持 反对

使用道具 举报

发表于 2013-8-8 08:40:32 | 显示全部楼层
无耻地恳求楼主写一个 linux c 串口通信教程。
回复 支持 反对

使用道具 举报

发表于 2013-8-8 10:27:29 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2013-8-8 10:43:34 | 显示全部楼层
linux 七窍已通六窍,家里的树莓派还在压箱底!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-8 10:53:47 | 显示全部楼层
Mr.Dante 发表于 2013-8-8 08:40
无耻地恳求楼主写一个 linux c 串口通信教程。

串口通信是一样的。都是走ttyAMA0
可以参考这文章

http://blog.csdn.net/qdhuxp/article/details/1041669
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-9 22:31:06 | 显示全部楼层
Mr.Dante 发表于 2013-8-8 08:40
无耻地恳求楼主写一个 linux c 串口通信教程。

花了两天时间研究出来的 用C写的还有GPIO也是用C..
自己去下载一个arduPi 库。用起来很方便与Arduino方法一样。。
  1. #include "arduPi.h"
  2. #include <stdlib.h>
  3. SerialPi serial;
  4. int main()
  5. {
  6.    setup();
  7.    while(1)
  8.    {
  9.      loop();
  10.     }
  11.    return 0;
  12. }

  13. void setup()
  14. {
  15.   serial.begin(9600);
  16.   serial.println("Testing");
  17. }
  18. void loop()
  19. {
  20.    if (serial.available())
  21.    {
  22.      char number = serial.read();
  23.      printf ("\nOut: %3d: ", number) ;
  24.    }
  25. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-8-12 09:13:25 | 显示全部楼层
wyd1520 发表于 2013-8-9 22:31
花了两天时间研究出来的 用C写的还有GPIO也是用C..
自己去下载一个arduPi 库。用起来很方便与Arduino方法 ...

我没有用库,linux他是可以操作串口的停止、校验方式,我写了一个。但问题是在正常的数据中夹带了一些莫名其妙的字符串,正在查错。
回复 支持 反对

使用道具 举报

发表于 2013-8-16 14:48:52 | 显示全部楼层
谢谢楼主分享
回复 支持 反对

使用道具 举报

发表于 2013-10-11 12:35:45 | 显示全部楼层
整 pcduino 吧, 可以想象是 树莓 的 arduno 兼容版
回复 支持 反对

使用道具 举报

发表于 2014-2-20 17:19:52 | 显示全部楼层
能放出arduino的接收数据的代码吗
回复 支持 反对

使用道具 举报

发表于 2015-1-15 16:34:38 | 显示全部楼层
收藏备用。
回复 支持 反对

使用道具 举报

发表于 2015-1-15 19:48:26 | 显示全部楼层
好东西啊,收了
回复 支持 反对

使用道具 举报

发表于 2015-1-15 19:54:34 | 显示全部楼层
promini怎么弄,能仔细说下么
回复 支持 反对

使用道具 举报

发表于 2015-1-21 20:47:49 | 显示全部楼层
我想问一下gpio传输的最大速率是多少啊?
谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-28 11:27 , Processed in 0.063258 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表