IoT・電子工作

PythonとArduinoをシリアル通信でつなごう!IoTデバイス入門ガイド

「ArduinoとPythonって、なんとなく別の世界の話な気がする…」そんなふうに感じている方、多いんじゃないでしょうか。

でも実は、シリアル通信という仕組みを使えば、PythonとArduinoはびっくりするくらい簡単につながります。これができると一気にIoTの扉が開く感じがして、個人的にはプログラミングで初めて「動いた!」と感動した体験に匹敵するくらい楽しいんですよね 😊

今回は、PythonとArduinoをシリアル通信でつないでIoTデバイスを作る方法を、ゼロからやさしく解説していきます。

📋 この記事の対象読者・難易度

Arduino Python electronics
Arduino Python electronics / Photo by Chengxin Zhao via Pexels
  • ✅ 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コースや電子部品もまとめています。

Arduinoロボット入門のおすすめコース・部品を見る →

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

Arduinoをはじめよう 第4版 (Make: PROJECTS)

もしも

Arduinoをはじめよう 第4版 (Make: PROJECTS)

Arduino公式推薦の定番入門書

Amazonで見る

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

もしも

徹底攻略! 電子工作&プログラミング Arduinoで学ぶ電子工作完全ガイド

電子工作とプログラミングを同時に学べる

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です