「ArduinoとPythonって一緒に使えるの?」「IoTデバイスって自分で作れるもの?」そんな疑問を持っている方、多いんじゃないでしょうか。😊
結論から言うと、ArduinoとPythonは相性抜群で、組み合わせることでIoTデバイスを自作できるんです。しかも思ったよりずっとシンプルに始められます。
今回は「ArduinoもPythonも少しだけ触ったことある」という方に向けて、ゼロからIoTデバイスを自作するチュートリアルをお届けします。実際に動くサンプルコードつきで解説するので、一緒に手を動かしてみましょう!
🔰 この記事の対象読者・難易度

- ✅ Pythonの基本構文(変数・ループ・関数)を知っている
- ✅ Arduinoをセットアップしたことがある、または興味がある
- ✅ 電子工作・IoTに興味があるけど「むずかしそう」と感じている
- ✅ 難易度:初〜中級者向け
この記事を読み終えれば、ArduinoとPythonを連携させるざっくりとした流れがつかめるはずです。「むずかしそう」が「できそう」に変わると思いますよ!
🤔 そもそもなぜArduinoとPythonを連携させるの?
ArduinoはセンサーやLEDなどハードウェアの制御が得意なマイコンボードです。一方Pythonはデータ処理・通信・GUIなどが得意な言語。
イメージとしては、こんな感じです👇
- 🤖 Arduino = 現場で働く作業員。センサーを読んだりLEDを光らせたりする
- 🧠 Python = 司令塔。データを受け取って処理したり、命令を送ったりする
この2つを組み合わせることで、「センサーの値をPCでリアルタイムに処理する」「Pythonからモーターを制御する」といった本格的なIoTデバイスが作れるようになります。
⚙️ 準備するもの
まず必要なものを確認しておきましょう。
- Arduino本体(Arduino Uno など)
- USBケーブル(ArduinoとPCを接続)
- LED・抵抗・ブレッドボード(今回のサンプル用)
- Arduino IDE(スケッチの書き込みに使用)
- Python 3.x がインストール済みのPC
- Pythonライブラリ:pyserial(シリアル通信用)
pyserialのインストールはターミナルで1行です。
pip install pyserial
これで準備はOKです!
📡 ArduinoとPythonの連携の仕組み
つまり、2つをつなぐ方法は「シリアル通信」です。
シリアル通信とは、USBケーブルを通じてArduinoとPCがデータをやりとりする仕組みのこと。Arduinoが「温度:25.3℃」とPCに送り、Pythonがその値を受け取って処理する、というイメージです。
流れをざっくりまとめると👇
- ArduinoがセンサーのデータをシリアルポートへPrintする
- PythonがそのポートをListenしてデータを受け取る
- Pythonがデータを処理・加工・表示する
とてもシンプルですよね。では実際にコードを書いていきましょう。
🛠️ STEP 1:ArduinoスケッチでデータをPCへ送る
まずはArduino側のコードです。今回はシンプルにアナログピンの値(センサー値に見立てて)を一定間隔で送信するスケッチを書きます。
// Arduinoスケッチ:センサー値をシリアルで送信
void setup() {
// シリアル通信を9600bpsで開始
Serial.begin(9600);
}
void loop() {
// A0ピンのアナログ値を読み取る(0〜1023)
int sensorValue = analogRead(A0);
// 読み取った値をシリアルポートへ送信
Serial.println(sensorValue);
// 500ミリ秒待つ
delay(500);
}
ポイントをまとめるとこんな感じです👇
- Serial.begin(9600):通信速度(ボーレート)を9600に設定。Python側と必ず合わせること!
- analogRead(A0):A0ピンのアナログ値(0〜1023)を取得
- Serial.println():値を改行つきで送信する
このスケッチをArduino IDEでボードに書き込んでおきましょう。
🐍 STEP 2:PythonでArduinoのデータを受け取る
次にPython側です。pyserialを使ってArduinoからの値を受け取ります。
import serial # シリアル通信ライブラリ
import time
# --- 設定 ---
# ポート名はOSによって異なります
# Windows: 'COM3' など / Mac・Linux: '/dev/ttyUSB0' など
PORT = '/dev/ttyUSB0' # ← 自分の環境に合わせて変更!
BAUD_RATE = 9600 # Arduinoのbaud rateと合わせる
# シリアルポートを開く
ser = serial.Serial(PORT, BAUD_RATE, timeout=1)
time.sleep(2) # Arduinoのリセット待ち(重要!)
print('Arduinoとの接続を開始しました!')
try:
while True:
# Arduinoからのデータを1行読み取る
line = ser.readline()
if line:
# バイト列 → 文字列 → 数値に変換
value = int(line.decode('utf-8').strip())
print(f'センサー値: {value}')
except KeyboardInterrupt:
print('\n終了します')
ser.close() # ポートを閉じる
ここが重要です!
- PORTの指定はOSによって異なります。Windowsは「デバイスマネージャー」、Mac・Linuxは
ls /dev/tty*コマンドで確認できます - time.sleep(2):接続直後にArduinoはリセットされるため、少し待たないとデータがうまく取れません。これ、うっかり忘れがちなので注意してください⚠️
- decode(‘utf-8’).strip():受け取ったバイト列を文字列に変換し、余分な改行を除去します
これを実行すると、500msごとにセンサー値が表示されるはずです。
🔁 STEP 3:PythonからArduinoへ命令を送る(双方向通信)
次のステップとして、PythonからArduinoにコマンドを送ることもできます。たとえば「1」を送ったらLEDをON、「0」を送ったらOFFにする、といった制御です。
Arduino側のスケッチはこうなります。
// Arduinoスケッチ:Pythonからの命令でLEDを制御
const int LED_PIN = 13; // 内蔵LEDのピン番号
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
// Pythonから文字が送られてきた場合
if (Serial.available() > 0) {
char command = Serial.read();
if (command == '1') {
digitalWrite(LED_PIN, HIGH); // LEDをON
Serial.println('LED: ON');
} else if (command == '0') {
digitalWrite(LED_PIN, LOW); // LEDをOFF
Serial.println('LED: OFF');
}
}
}
Python側からはser.write(b'1')のように送ればOKです。「1」を送ればLEDが光り、「0」で消える。これだけでもう立派なIoT的な制御ですよね!😄
💡 よくあるトラブルと対処法
実際に動かしてみると詰まりやすいポイントがあります。確認しておきましょう。
- ❌ ポートが見つからない → Arduino IDEの「ツール→ポート」で確認。Arduino IDEのシリアルモニタを閉じてからPythonを実行
- ❌ 文字化け・値がおかしい → baud rateがArduinoとPythonで一致しているか確認
- ❌ 最初の数行がゴミデータ → time.sleep(2)を忘れずに入れる
- ❌ Permission denied(Mac・Linux) →
sudo chmod 666 /dev/ttyUSB0を実行
📝 まとめ
今回はArduinoとPythonをシリアル通信で連携させてIoTデバイスを自作する基本の流れを解説しました。
- ✅ ArduinoはUSBシリアル通信でPCとデータをやりとりできる
- ✅ PythonはpyserialでArduinoのデータを受信・送信できる
- ✅ 双方向通信でセンサー読み取り+デバイス制御の両方が実現できる
「IoTってむずかしそう」と思っていた方も、基本はシリアル通信という1本のパイプだということが伝わったでしょうか?😊
まずはこのサンプルを手元で動かしてみてください。センサーを温度センサーや距離センサーに変えるだけで、応用の幅がぐっと広がります。ぜひ自分だけのIoTデバイスを作ってみてください!一緒に電子工作の世界を楽しんでいきましょう🚀
📡 Arduinoをもっと深く学ぼう!
Arduino・ラズパイ・ロボットプログラミングを体系的に学びたい方へ。おすすめのUdemyコースや電子部品もまとめています。





