名称未設定

RaspberryPi Zero WHと Arduino Pro mini でシリアル通信してみる

最近ではディスプレイ付きのマイコン M5Stack や機械学習向けの NVIDIA Jetson Nano など様々なマイコンが登場しています。用途にも寄るとは思いますが、なるべくモノをコンパクトにしたいといった場合には RaspberryPi Zero や Arduino Pro mini などが役に立つと思います。さらにこれらを連携させることで様々な応用が効くと思うので試してみました。

開発環境

- RaspberryPi Zero WH
- Distributor ID:    Raspbian
- Description:	     Raspbian GNU/Linux 9.11 (stretch)
- Release:	     9.11
- Codename:	     stretch

- Arduino Pro mini (5V)

準備

1. RaspberryPi のシリアルポートを解放する(以下手順2~4)

2. 以下コマンド実行してシリアルコンソールを無効化

sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service

3.  /boot/cmdline.txt を編集(以下の「console=serial0,115200」を削除) 

dwc_otg.lpm_enable=0 console=tty1 console=serial0,115200 root=PARTUUID=385cd2a3-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles

4. RaspberryPi を再起動

5. RaspberryPi の GPIO14(Pin8)と Arduino の Pin5 、RaspberryPi の GPIO15(Pin10)と Arduino の Pin6 をつなぐ(*)

*この接続の間には レベル変換モジュール(こちらなど) を入れて電圧降下をしてください。RaspberryPi は 3.3V で動作、今回使用している Arduino Pro mini は 5V 動作のため、Arduino から RaspberryPi へ信号を送信すると電圧が上限を超えてしまい、RaspberryPi が壊れてしまいます。Arduino Pro mini の 3.3V のものであればレベル変換モジュールは必要ないです。

動作テストコード

RaspberryPi と Arduino でシリアル通信して、Arduino に標準装備されている LED を光らせるまでを試してみます。RaspberryPi から「led;」というコマンドを送信し、Arduino で受信し、LED を光らせるという流れになります。

Arduino 側

#include <SoftwareSerial.h>

// RaspiのGPIO14(TXD0) - Arduino PIN 5(RXとする)
// RaspiのGPIO15(RXD0) - Arduino PIN 6(TXとする)

const int SERIAL_PIN_RX = 5;
const int SERIAL_PIN_TX = 6;
const int LED_PIN = 13;

SoftwareSerial ser(SERIAL_PIN_RX, SERIAL_PIN_TX);

boolean ledOn = false;

void setup() {
 ser.begin(9600);
 
 // シリアルモニタ用
 Serial.begin(9600);
 Serial.println("Serial Start");
 
 pinMode(LED_PIN, OUTPUT);
}

void loop() {

 
 if (ser.available()) {
   String inputStr = ser.readStringUntil(';');
   Serial.println(inputStr);
   if (inputStr.equals("led")) {
     Serial.println("toggle LED");
     toggleLED();
   } else {
     Serial.println(inputStr);
   }
 }
}

void toggleLED() {
 ledOn = !ledOn;
 digitalWrite(LED_PIN, ledOn);
}

RaspberryPi 側(Python)

import sys
import time
import serial

if __name__ == '__main__':

	ser = serial.Serial('/dev/ttyS0', 9600, timeout=5, write_timeout=3)
	time.sleep(2)

	while True:
		command = input("Enter command: led; - toggle LED, e - exit ")
		if command == 'led;':
			ser.write(command.encode('utf-8'))
		elif command == 'e':
			print('System exit.')
			break

	ser.close()
	sys.exit()

まとめ

今回の RaspberryPi と Arduino の連携を応用させることで、RaspberryPi と Arduino のそれぞれ弱いところを補うことができます。また、役割分担ができることもメリットでしょう。

この記事が気に入ったらサポートをしてみませんか?