將Arduino與RasveryPi版上的RX與TX互接(PiRX=ArduiTX)
Pi版上請參考該技術手冊,Arduino則由程式碼內可得知
執行:ps ax | fgrep AMA
你會看到
2039 ? Ss+ 0:00 /sbin/getty -L ttyAMA0 115200 vt100
2055 pts/0 S+ 0:00 fgrep --color=auto AMA
確認無誤之後,繼續輸入以下指令:
sudo cp /boot/cmdline.txt /boot/cmdline_backup.txt
將cmdline.txt備份
sudo vim /boot/cmdline.txt
cmdline.txt如下:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
將它改為:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
修改完畢後,執行:
sudo vi /etc/inittab
請利用指令搜尋 /spawn 找到
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
改為:
#Spawn a getty on Raspberry Pi serial line
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
修改完畢後,執行
sudo reboot
重新啟動後,執行:
ps ax | fgrep AMA
確認出現以下訊息:
2069 pts/0 S+ 0:00 fgrep --color=auto AMA
Python程式碼:
import serial
import os
os.system("sudo chmod 666 /dev/ttyAMA0")
Uart = serial.Serial("/dev/ttyAMA0", baudrate = 38400, timeout = 1)
Uart.write("Pi UART is already.")
print("Pi UART is already.")
while True:
UartSTR = Uart.readline()
if len(UartSTR) > 2:
print UartSTR,
Uart.write(UartSTR)
Arduino程式碼:
#include <SoftwareSerial.h>
#include <Wire.h>
#define UartRX 2
#define UartTX 3
#define Led 13
byte serialA;
SoftwareSerial I2CBT(UartRX ,UartTX );
void CtrlLED(char str[128]);
/*================================================*/
void setup(){
Serial.begin(9600);
I2CBT.begin(38400);
Serial.println("Welcom Uart CTRL");
I2CBT.println("Welcom Uart CTRL");
pinMode(Led, OUTPUT);
}
/*================================================*/
void loop(){
ScanI2cStr();
ScanSerialStr();
}
/*================================================*/
void ScanI2cStr(){
if(I2CBT.available()) {
int strnum=0;
char str[128]="";
memset( str, 0, strlen(str) );
while (I2CBT.available() > 0){
str[strnum++] = I2CBT.read();
delay(3);
}
Serial.print("UartReturn:");
Serial.println(str);
// I2CBT.print("I2CGet:");
// I2CBT.println(str);
}
}
void ScanSerialStr(){
if(Serial.available()) {
int strnum=0;
char str[128]="";
memset( str, 0, strlen(str) );
while (Serial.available() > 0){
str[strnum++] = Serial.read();
delay(3);
}
Serial.print("ScanSerialSend:");
Serial.println(str);
// I2CBT.print("ScanSerialSend:");
I2CBT.println(str);
}
}
執行後從Arduino端發送指令,Raspberry端會自動將收到的指令回傳。
參考資料:
Serial涵式庫說明
Pi版UART出現錯誤
附註:
Arduino指令上傳:
輸入指令時可用複製貼上一次打入多個字元
VIM編輯器增加顏色
在 .vimrc 中加入以下這行:
autocmd BufRead,BufNewFile *.ino set filetype=cpp
沒有留言:
張貼留言