「ArduinoとPythonって、なんとなく別の世界の話な気がする…」そんなふうに感じている方、多いんじゃないでしょうか。
でも実は、シリアル通信という仕組みを使えば、PythonとArduinoはびっくりするくらい簡単につながります。これができると一気にIoTの扉が開く感じがして、個人的にはプログラミングで初めて「動いた!」と感動した体験に匹敵するくらい楽しいんですよね 😊
今回は、PythonとArduinoをシリアル通信でつないでIoTデバイスを作る方法を、ゼロからやさしく解説していきます。
📋 この記事の対象読者・難易度

- ✅ PythonのコードをなんとなくPCで動かせる方
- ✅ ArduinoのLチカ(LEDを光らせること)を試したことがある方
- ✅ IoTやハードウェア連携に興味がある方
難易度は初〜中級者向けです。シリアル通信の仕組みからコード例まで、順を追って説明しますね。
🔌 シリアル通信ってそもそも何?
まず「シリアル通信」という言葉からやさしく説明します。
イメージとしては、PCとArduinoが1本のパイプで会話している感じです。データを1ビットずつ順番に送受信する方式で、USBケーブル1本でつなぐだけで使えます。難しい配線は不要です。
つまり、こういうことができるようになります。
- 📡 PythonからArduinoに命令を送る(例:「LEDをつけて」)
- 📊 ArduinoのセンサーデータをPythonで受け取る(例:温度・湿度の取得)
- 🤖 Pythonで処理した結果をArduinoに反映させる(例:AIの判断でモーターを動かす)
これだけでも、立派なIoTデバイスになりますよね 🎉
🛠️ 準備するもの
- Arduino本体(Uno・Nano・Megaなど)
- USBケーブル(ArduinoとPCをつなぐもの)
- Python 3系がインストールされたPC
- Pythonライブラリ:pyserial
pyserialはシリアル通信を扱うためのPythonライブラリです。インストールは1行で完了します。
pip install pyserial
インストールできたか確認しておきましょう。
python -c "import serial; print(serial.__version__)"
バージョン番号が表示されればOKです ✅
⚙️ STEP 1:Arduino側のスケッチを書く
まずはArduino側を準備します。Arduinoのコードは「スケッチ」と呼ばれますよね。
今回はシンプルに、Pythonから「H」という文字が送られてきたらLEDをON、「L」でOFFするスケッチを書いてみましょう。
// Pythonからの命令でLEDを制御するスケッチ
const int LED_PIN = 13; // 内蔵LEDのピン番号
void setup() {
Serial.begin(9600); // シリアル通信を9600bpsで開始
pinMode(LED_PIN, OUTPUT); // LEDピンを出力モードに設定
}
void loop() {
// シリアルにデータが届いていたら読み取る
if (Serial.available() > 0) {
char command = Serial.read(); // 1文字読み込む
if (command == 'H') {
digitalWrite(LED_PIN, HIGH); // LEDをON
Serial.println("LED ON"); // Pythonへ返信
} else if (command == 'L') {
digitalWrite(LED_PIN, LOW); // LEDをOFF
Serial.println("LED OFF"); // Pythonへ返信
}
}
}
ポイントをまとめるとこんな感じです 👇
- Serial.begin(9600):通信速度(ボーレート)を指定。Python側と合わせる必要があります
- Serial.available():受信データがあるかどうかを確認する関数
- Serial.println():Pythonへデータを返送できます(双方向通信!)
このスケッチをArduino IDEで書き込んでおいてください。
🐍 STEP 2:Python側のコードを書く
次はPython側です。pyserialを使ってArduinoと通信します。
まず、自分のPCでArduinoがどのポートに認識されているかを確認しましょう。
- Windowsの場合:デバイスマネージャーで「COM3」「COM4」など
- Mac / Linuxの場合:
/dev/tty.usbmodemや/dev/ttyUSB0など
確認できたら、以下のコードを試してみましょう。
import serial # pyserialをインポート
import time
# ポート名とボーレートをArduinoのスケッチに合わせる
# Windowsなら 'COM3' など、Macなら '/dev/tty.usbmodemXXXX' など
SERIAL_PORT = '/dev/tty.usbmodem1401' # ← 自分の環境に合わせて変更
BAUD_RATE = 9600
# シリアルポートを開く(Arduinoとの接続確立)
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
time.sleep(2) # Arduinoがリセットするまで少し待つ(重要!)
print("Arduinoと接続しました 🎉")
# LEDをON → 1秒待つ → OFFを3回繰り返す
for i in range(3):
# 'H'を送ってLEDをON
ser.write(b'H')
response = ser.readline().decode('utf-8').strip()
print(f"Arduino応答: {response}")
time.sleep(1)
# 'L'を送ってLEDをOFF
ser.write(b'L')
response = ser.readline().decode('utf-8').strip()
print(f"Arduino応答: {response}")
time.sleep(1)
# 接続を閉じる
ser.close()
print("通信を終了しました")
ここが重要です ⚡
- time.sleep(2):Arduinoはシリアル接続時に自動でリセットします。このウェイトを入れないと通信が安定しないことがあります
- ser.write(b’H’):バイト列として送信するため
b'H'と書くのがポイント - ser.readline():Arduinoからの返信を1行単位で受け取ります
- ser.close():使い終わったら必ずポートを閉じましょう。閉じないと次回の接続時にエラーになることがあります
📊 STEP 3:センサーデータをPythonで受け取る(応用編)
双方向通信ができると、IoTらしさがグッと高まります。今度はArduinoのアナログピンの値(例:照度センサーや可変抵抗の値)をPythonでリアルタイムに受け取ってみましょう。
Arduino側はこんなシンプルなスケッチです。
// アナログ値をPythonへ送り続けるスケッチ
void setup() {
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0); // A0ピンのアナログ値を読む(0〜1023)
Serial.println(sensorValue); // Pythonへ送信
delay(500); // 0.5秒ごとに送信
}
Python側でデータを受け取るコードはこちらです。
import serial
import time
SERIAL_PORT = '/dev/tty.usbmodem1401' # 自分の環境に合わせて変更
BAUD_RATE = 9600
ser = serial.Serial(SERIAL_PORT, BAUD_RATE, timeout=1)
time.sleep(2)
print("センサーデータの受信を開始します(Ctrl+Cで停止)")
try:
while True:
line = ser.readline().decode('utf-8').strip()
if line: # 空行をスキップ
sensor_value = int(line)
# 0〜1023の値をパーセントに変換して表示
percent = round(sensor_value / 1023 * 100, 1)
print(f"センサー値: {sensor_value} ({percent}%)")
except KeyboardInterrupt:
print("\n受信を停止しました")
finally:
ser.close() # 必ず接続を閉じる
ざっくりとした流れがつかめるはずです 👌 センサーの値がリアルタイムでターミナルに流れてくる様子は、初めて見るとちょっと感動しますよ。
⚠️ よくあるエラーと対処法
シリアル通信でつまずきやすいポイントをまとめておきます。
- 🔴 「could not open port」エラー:ポート名が間違っているか、Arduino IDEのシリアルモニタが開いたままになっています。シリアルモニタを閉じてから実行しましょう
- 🔴 文字化けする・データがおかしい:ArduinoのボーレートとPythonのボーレートが一致しているか確認を
- 🔴 すぐに接続が切れる:
time.sleep(2)のウェイトを忘れていないか確認してみてください
まとめ
今回はPythonとArduinoをシリアル通信でつなぐ方法を、LEDの制御とセンサーデータの取得を例に解説しました。
pyserialを使えば、わずか数行のコードでPCとArduinoが双方向に通信できる、というのが伝わったでしょうか 😊 「むずかしそう」が「できそう」に変わっていれば嬉しいです!
ここから発展させると、Pythonで機械学習の結果をArduinoに送ったり、センサーデータをグラフにリアルタイム描画したり、Webアプリと連携させたりと、アイデア次第で一気にIoTらしいプロジェクトに育てることができます。
まずは手元のArduinoとPCで、ぜひ試してみてください 🚀
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。





