Youtubeでも活動中チャンネルはこちら!

Arduinoにシリアル通信を使って外部から指令する方法

arduino-serial-control-eyecatch

[Sponsored]少量ロットでも基板は作れる!

JLCPCB-banner4

 今回はArduinoへパソコンから指令を出して、Arduinoを操る方法についてご紹介します。

 基本的なArduinoの使い方として思いつくのは、Arduinoに書き込んだスケッチが自動で繰り返されるものだと思います。setup関数⇒loop関数と進み、あとはloop関数内をグルグル回るだけです。

 ただし、今回ご紹介する方法を使うと、パソコン側と連携してloop関数に書くだけでは実現できないような高度な内容まで対応することが可能になります。ポイントは【シリアル通信】です。

 例えば1つ例を挙げると、Arduinoを使ってLCDに文字を表示させる場合を考えてください。今回ご紹介する内容を知らないと、あらかじめいくつかの表示させたい文字列をスケッチ内で記述することになりますよね?

 でも実際には、どんな文字でも気軽に変更して表示させたいと思いますよね。そんな時わざわざArduinoに書き込まれているスケッチを書き換えて、Arduinoに書き込まないといけない。と思っていませんか?

 今回ご紹介する方法なら、Arduinoに書き込まれているスケッチを一切変えることなくPCからお好きな文字をその場で表示することができます!

 例としてLCDのお話をしましたが、LCD以外にもPCからのコマンドによって分岐をさせたり、PCで作ったアプリケーションと連携させてPLCのように使うことだって可能です。

 夢が広がりますよね!それでは解説していきましょう!

この記事を読むことでわかること

ArduinoとPCを連携することでより創作の幅を広げる方法がわかる

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

転職に成功して現在は超大手企業で、電気・制御の分野で装置の研究開発をしています。

_/_/_/_/_/Youtubeでも情報発信中!_/_/_/_/_/

本ブログはアフィリエイトを用いた広告を掲載している場合があります。

今回はLチカを題材にして紹介します。

 今回はLチカを例にして解説します。やはりマイコン制御の登竜門といえばLEDを光らせる、通称Lチカですよね。あなたもきっと1度は経験があるはずです。

 Lチカも今回紹介する3つのやり方があります。2つ目までは理解していても、3つめのシリアル通信まで行くと、わかる人が減ってしまう印象です。

 シリアル通信を使う方法は、冒頭でもご紹介しましたが、かなり有用な機能です。シリアル通信を自由に操ることができれば、かなり複雑な制御も可能になります。順を追って3つそれぞれを解説します。

 結論だけ知りたい方はシリアル通信の章をご覧ください。

1. スケッチ内にべた書きする基本のLチカ

まずはArduinoの基本である、スケッチ内にべた書きするLチカです。

void setup() {
  pinMode(13, OUTPUT);
}

void loop() {
  digitalWrite(13, HIGH);
  delay(500);
  digitalWrite(13, LOW);
  delay(500);
}

 この方法は非常にシンプルで、Arduinoの入門として最適です。しかし、動作を変えたい場合はスケッチを書き換えて再書き込みする必要があります。点滅速度を変えたい、パターンを変えたい、外部から制御したいといった要望には対応できません。いわゆるスタンドアロンの使い方といえます。

 Arduino単体で完結する動作しかできないという点が、この方法の限界です。ほかに連携する必要のある機器が全くない場合は、これでも成立するでしょう。

2. I/OのON/OFF状態を使って条件分岐するLチカ

 次に、外部入力によって動作を変えるLチカです。【スイッチを押したら点滅速度が変わる】といった仕組みを作ることができます。

const int ledPin = 13;
const int swPin = 2;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(swPin, INPUT_PULLUP);
}

void loop() {
  int sw = digitalRead(swPin);//  ここでArduinoの2番ピンのHigh or Lowを読む。

  if (sw == LOW) {
    digitalWrite(ledPin, HIGH);
    delay(100);
    digitalWrite(ledPin, LOW);
    delay(100);
  } else {
    digitalWrite(ledPin, HIGH);
    delay(500);
    digitalWrite(ledPin, LOW);
    delay(500);
  }
}

 この方法では、外部入力によって動作を切り替えることができます。しかし、制御できるのはArduinoに直接つながったI/Oだけで、条件を増やすほど配線が複雑になります。また、PCアプリや外部システムとの連携は難しく、柔軟性に欠けます。

 今回の場合は、IO2番のピンにスイッチを物理的に配線しなければいけません。1個ならいいですが、10個も20個もスイッチをつけるのは現実的じゃないですよね…

 ここで登場するのがシリアル通信です。シリアル通信ならそんな面倒なことは不要になります。

3. シリアル通信でPCからのコマンドを読み込んで条件分岐するLチカ

 ArduinoとPCをUSBケーブルで接続し、PCから文字列コマンドを送ることで、Arduinoの動作をリアルタイムに変更できます。PC側から文字列コマンドを送る方法は、各種存在していて、pythonでもなんでもよいです。USB経由でシリアル通信できる仕組みがあれば対応可能です。この部分は別記事でも紹介したいと思います。

 例えば以下のようなコマンドをPCから送るとします。

  • FAST → 高速点滅
  • SLOW → 低速点滅
  • STOP → 消灯

 Arduino側のスケッチは次のようになります。

String cmd = "";

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  if (Serial.available()) {
    cmd = Serial.readStringUntil('\n');
  }

  if (cmd == "FAST") {
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
  } else if (cmd == "SLOW") {
    digitalWrite(13, HIGH);
    delay(500);
    digitalWrite(13, LOW);
    delay(500);
  } else if (cmd == "STOP") {
    digitalWrite(13, LOW);
  }
}

PC側からの送信例(Python)は次の通りです。

import serial
ser = serial.Serial('COM3', 9600)

ser.write(b"FAST\n")

 これだけでArduinoの動作が高速点滅に即座に切り替わります。Python側のアプリケーションの内容によって高速に点滅させたかったり、ゆっくり点滅させたいこともあるでしょう。その場合でも、シリアル通信でArduinoに文字列コマンドを送ってあげれば、挙動の変更が可能です。結構単純ですよね。

シリアル通信がもたらす大きなメリット

 ここが今回もっとも伝えたいポイントです。シリアル通信を使うことで、Arduinoの可能性は飛躍的に広がります。

スケッチを書き換える必要がなくなる

 Arduino側のスケッチは固定のまま、PCからコマンドを送るだけで動作を変更できます。LCD表示の文字列変更、モーター制御、センサーの閾値変更など、すべてPC側から操作できます。

PCアプリと連携できる

 Python、C#、JavaScriptなど、PC側のアプリケーションからArduinoを操作できます。GUIボタンでLEDを点滅させたり、PCで計算した結果をArduinoに送ったり、Arduinoを外部デバイスとして扱うことができます。

PLCのような使い方も可能

 PC側で複雑なロジックを処理し、Arduinoは単純なI/O制御に専念させる。これにより、ArduinoがPLCのような役割を果たすこともできます。

応用範囲が一気に広がる

 ログ収集、外部機器制御、リアルタイムモニタリング、データ可視化、IoTシステムの構築など、Arduino単体では難しいことがシリアル通信によって可能になります。

今回のまとめ:シリアル通信を使うことでできることが増える

今回のまとめ
  • PCアプリと連携するときはシリアル通信がほぼ必須。
  • シリアル通信が使えるようになると、工作の幅が飛躍的に広がる。
  • アプリ開発+電子工作の融合が実感できる。

今回紹介した3つのLチカを振り返ると、Arduinoの制御方法がどのように進化していくかがよくわかります。

  • スケッチ内べた書き:Arduinoのみのスタンドアロンの使い方。
  • I/Oによる条件分岐:外部の電気信号によって挙動を変化させる使い方。
  • シリアル通信でPC制御:PCからのコマンドによって挙動を変化させる使い方。

 特にシリアル通信は、Arduinoの可能性を飛躍的に広げる最重要ポイントです。スケッチを書き換えなくても動作を変えられ、PCアプリと連携でき、Arduinoを外部デバイスとして扱えるようになります。

 Arduinoをただ動かすだけでなく、「ArduinoをPCから操る」という新しい世界がここから始まります。シリアル通信を使うことで、Arduinoでできることは一気に増えます。ぜひ今回の内容をきっかけに、シリアル通信の有用性を体感してみてください。