树莓派与Arduino通过GPIO通信

树莓派折腾小记——树莓派与Arduino通过GPIO通信

01打开GPIO串口

打开配置

sudo raspi-config

选择Interfacing Optionsserial

然后出现

Would you like a login shell to be accessible over serial?NO

would you like the serial port hardware to be enabled?YES

出现

The serial login shell is disabled
The serial interface is enabled 

据说为取得稳定性,要把GPIO串口serial0映射到ttyAMA0上,与serial1映射的串口对换…

sudo vim /boot/config.txt

在末尾添加

dtoverlay=pi3-miniuart-bt

重启,ls -l /dev可以看到serial0映射到ttyAMA0serial1映射到ttyS0上了

安装python3的GPIO库

sudo aptitude install python3-rpi.gpio

这样就可以愉快的使用了

02测试

<硬件>

树莓派TX\longleftrightarrowArduinoRX

树莓派RX\longleftrightarrowArduinoTX

树莓派GND\longleftrightarrowArduinoGND

LED+\longleftrightarrowArduinoPin13,LED-\longleftrightarrowArduinoGND

<软件>

把这个上传到Arduino上

//arduino
char ch;
const int led=13;
int state=LOW;

void setup() {
  Serial.begin(9600);
  pinMode(led, OUTPUT);
}

void loop() {
    if(Serial.available()) {
        ch=Serial.read();
        if(ch=='1') {
            state=HIGH;
            Serial.println("light is on.");
        } if(ch=='0') {
            state=LOW;
            Serial.println("light is off.");
        }
    }
    digitalWrite(led,state);
}

在树莓派上用python3运行这个

#test2,python 3.7
import serial
ser = serial.Serial('/dev/ttyAMA0',9600,timeout=1)

while 1:
    ser.write(input().encode())
    repo = ser.readall()
    print(repo)

注意上面的encode()函数。

输入1,LED灯亮,输入0,LED灯灭…是不是很神(wu)奇(liao)~~~

[email protected]:~ $sudo python test.py
1
light is on.

0
light is off.

一个值得注意的事情是,python控制GPIO是真的慢…(C真香)
在实验中,当字符1输进去的那一刻,灯立刻就亮了,但过了快半秒arduino发出的light is on.才传回来。

进一步玩耍

只搞一个灯有点无聊,两个灯就会高级很多

如果用红色灯表示0,绿色灯表示1。我们输入任意一段信息,两个灯通过闪烁的方式表达。

把红LED接到12引脚,负极接GND,稍稍改动一下arduino的程序

char ch;
const int green=13;
const int red=12;

void setup() {
  Serial.begin(9600);
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
}

void loop() {
    if(Serial.available()) {
        ch=Serial.read();
        if(ch=='1') {
            digitalWrite(green,HIGH);
            delay(200);
            digitalWrite(green,LOW);
        } if(ch=='0') {
            digitalWrite(red,HIGH);
            delay(200);
            digitalWrite(red,LOW);
        }
    }
}

python提供了方便好用的内置函数,减少了重新造轮子的时间…

#python 3.7
import serial
import time
import binascii
ser = serial.Serial('/dev/ttyAMA0',9600,timeout=1)

while 1:
    info=bin(int(binascii.b2a_hex(input().encode()),16))
    print(info) #print this info in binary on terminal
    for i in info :
        ser.write(i.encode())
        time.sleep(0.25)

sleep()是以秒为单位的(为了提升视觉效果)。

让它用二进制输出《念奴娇·赤壁怀古》,闪了快11分钟…不延迟的话应该会快很多。

附录

这是更新前使用的python2

#test.2py,python 2.7
import serial
ser = serial.Serial('/dev/ttyAMA0',9600,timeout=1)

while 1:
    ser.write(raw_input())
    repo = ser.readall()
    print repo

发表评论

电子邮件地址不会被公开。 必填项已用*标注