跳过主要内容

树莓派和Arduino如何一起使用

使用树莓派与Arduino的
(图片来源:未来)

Arduino的和覆盆子π是两个完全不同的产品,但他们都迎合渴望黑客和制造商。如果我们可以一个Arduino连接到树莓派,并用它作为从设备:一个能够反应输入和通过Python将输出发送到我们的树莓派?

毕竟,Arduino的,而不是一个完整的计算机,有它更好,几件事情像转换模拟到数字,其内置的ADC芯片。要连接的Arduino的树莓派,我们将需要一些特殊的软件,那就是本教程的开始。

软件安装到使用树莓派与Arduino的

之前,我们可以写任何Python代码,我们需要下载安装Arduino的IDE为Linux ARM 32位.一旦安装,我们需要添加用户“PI”,以正确的组将数据发送到Arduino。所以到pi添加到组,打开一个终端,键入以下

$ sudo usermod -a -G dialout pi

然后在继续之前重启你的树莓派。随着派的重启,打开Arduino的IDE, 和选择文件>示例>基本>眨眼进而转到>工具板选择你的董事会.在我们的测试中,我们使用Arduino Uno。

然后去工具>端口并确保您的板的端口已选定。现在点击素描>上传(或点击菜单中的箭头)上传代码到Arduino。几秒钟后,Arduino的内置LED会慢慢亮/灭。这证明了我们有一个工作单元。

测试完成后,我们现在可以闪光一个特殊的草图,它将使我们能够用Python与Arduino对话。进入文件> Examples > Firmata > StandardFirmata然后把这个草图放到你的Arduino上。一旦它闪烁,你可以关闭Arduino IDE。要安装pyFirmata库,请打开一个新的终端并键入以下

$ sudo的PIP3安装pyfirmata

项目的Hello World上树莓派与Arduino的

为了测试我们的Arduino将与Python的工作,我们将写一个快速脚本打开连接到Arduino的12脚的LED。请参阅的连接图。

使用树莓派Arduino: Arduino LED灯图

图表显示Arduino的乌诺如何连接到LED的光。 (图片来源:未来)

插入Arduino,并在终端中键入以下代码。寻找诸如ttyUSB0和ttyACM0这样的USB设备。在继续之前做个笔记。

$ dmesg的

使用您最喜欢的Python 3编辑器(IDLE, thony, nano, Vim),创建一个新文件命名为LED_test.py.现在我们将在这个文件中写入一些Python代码。首先从pyFirmata库导入两个类,这将使我们的代码能够连接到Arduino。然后我们可以从时间库中导入sleep函数,通过打字

从pyfirmata进口的Arduino,不时进口睡眠UTIL

下一步是创建一个名为木板这将是我们的皮到Arduino的连接。对于这一点,我们将需要从dmesg的使用USB设备的信息。在我们的情况下,我们的Arduino是在ttyUSB0。

董事会= Arduino(“/ dev / ttyUSB0”)

所谓变量领导用于存储Arduino的pin码。你可以通过添加行

导致= 12

里面的而真循环,我们可以写这将打开和关闭LED代码每0.2秒。我们将调用对象木板,使用一个类来数字控制引脚(0,1),然后将1写入引脚以打开它。注意,我们使用了这个变量领导识别针。然后,我们睡了0.2秒,打开销关闭和睡眠一次了。

而正确:board.digital [LED] .WRITE(1)睡眠(0.2)board.digital [LED] .WRITE(0)睡眠(0.2)

保存代码,然后运行它从你的编辑器(IDLE运行>运行模块/ thony运行>运行当前脚本),几秒钟后,连接到Arduino的LED将闪烁,证明我们有一个工作连接。

最终的python脚本应该是这样的:

from pyfirmata import Arduino, util from time import sleep board = Arduino('/dev/ttyUSB0') led = 12 while True: board.digital[led].write(1) sleep(0.2) board.digital[led].write(0) sleep(0.2)

闪烁的LED灯与树莓派和Arduino

现在让我们创建一个新项目。这将是一个闪烁的LED,但每次闪烁之间的间隔是通过电位器控制的,电位器是一个模拟电子元件,如果没有额外的ADC(模数转换)板,树莓派通常无法使用。

我们可以使用Arduino返回的值来控制LED闪烁的速度。我们将把电位器添加到我们刚刚搭建和测试的现有LED测试电路中。请参阅下面的图表了解更多信息。

用树莓派配Arduino: Arduino配电位器电路图

Arduino Uno板连接电位器和LED灯。 (图片来源:未来)

我们会启动代码这个项目在新的空白文件,使用相同的线导入和配置引脚上的Arduino的使用。

从进口pyfirmata的Arduino,util的从时间导入睡眠板= Arduino的( '的/ dev / ttyUSB0')​​导致= 12

从Arduino的读取模拟值,我们需要创建一个线程它将运行而不中断主代码。我们应该创建一个名为然后把这个连接到Arduino上,然后开始线程。

it = util.Iterator(board) .start() board.analog[0].enable_reporting()

的代码的主体是一个而真循环,这将读类似物销0,其被连接到电位器的电流值,并将该值存储在一个所谓的可变价值.这个值将被打印到Python shell中。

while True: value = board.analog[0].read() print(value)

条件测试现在应用于价值变量。如果值没有数据,那么它将不返回任何数据,这将导致代码崩溃。因此一个如果条件检查值,并且,如果它是没有,它它变为0。

如果值==无:值= 0

测试此另一个条件是如果该值大于0.05,则返回的模拟值是0.0和1.0之间。如果该值的大于0.05的LED被接通时,和在睡眠间隔中,用于通过暂停代码,以保持在LED /关,由所述控制价值

Elif value > 0.05: board.digital[led].write(1) sleep(value) board.digital[led].write(0) sleep(value)

最后几行代码是else条件,如果值小于0.05,则关闭LED。保存代码并运行。现在转动电位器,看到LED开始工作。你最终的python代码应该是这样的:

从进口pyfirmata的Arduino,util的从LED = 12时间进口睡眠板= Arduino的( '的/ dev / ttyUSB0')​​它= util.Iterator(板)it.start()board.analog [0] .enable_reporting(),而正确:值= board.analog [0] .read()打印(value)如果值==无:值= 0的elif值> 0.05:board.digital [LED] .WRITE(1)睡眠(值)board.digital [导致] .WRITE(0)睡眠(值)

这篇文章最初出现在Linux的格式杂志发行260

  • glenn_n
    为什么不直接使用A / d转换器?有更少的硬件,更复杂,你只需要在R-PI计划,也不需要为Arduino的也写代码。本文将向您展示的方式(除了软件位过时):https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters
    回复
  • Dr.J
    glenn_n说过:
    为什么不直接使用A / d转换器?有更少的硬件,更复杂,你只需要在R-PI计划,也不需要为Arduino的也写代码。本文将向您展示的方式(除了软件位过时):https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters
    因为这很有趣,在学习了这种方法之后,了解也会很有趣
    回复