一方、場合によってはMCUの役割は非常に重要です。 Edisonを使用してさまざまなセンサーを操作しようとした人はすでに気付いているかもしれません。IntelEdisonは、Linuxで作業しているとき、読み取り値にリアルタイムで応答しません。 そして、MCUが助けになります。 この組み込みマイクロコントローラ、そのアーキテクチャ、アプリケーションについて少し話をし、実用的な例を検討する時が来ました。
バージョン2.1以降、組み込みのマイクロコントローラーを使用する機能がIntel Edisonのソフトウェアに追加されました。
Intel Edison Compute Moduleで使用されるチップ上のシステムを検討してください。
Intel Edison Compute Moduleで使用されるチップシステムには、2つのプロセッサーが含まれています。
- 500 MHzでクロックされるデュアルコアIntel Atomプロセッサ。 ホストCPUとして指定。
- 100 MHzの周波数で動作する、Minute IAアーキテクチャを備えたマイクロコントローラー。 MCUとして指定されています。
マイクロコントローラをより詳細に検討してください。 Minute IA Computing Coreは、486に基づくエネルギー効率の高いアーキテクチャであり、Pentium互換性のための命令が追加されています。 コンピューティングコアに加えて、マイクロコントローラーには入出力サブシステム(GPIO、I2C、高速UART、DMA)およびSRAMが含まれています。 マイクロコントローラーは、Edison Compute ModuleのすべてのGPIOポートにアクセスできます。 コードとデータのSRAMの合計量は192 kbです。 マイクロコントローラーは、WindRiverのViper OSリアルタイムオペレーティングシステムを実行します。
マイクロコントローラーアプリケーションはViperコア上で実行され、Intel Atomプロセッサーに関係なく、MCUに接続された周辺機器を制御します。 たとえば、GPIOポートを制御し、I2CまたはUARTを介してセンサーと通信し、Intel Atomプロセッサと通信できます。
Intel Edisonにマイクロコントローラーが必要なのはなぜですか?
組み込みのマイクロコントローラーを使用できる2つの領域を特定します。
- 入力/出力ポートおよびインターフェースをリアルタイム応答で操作します。
- エネルギー効率。
Intel Atomプロセッサと標準のYocto Linuxディストリビューションでは、すぐに使用できるアプリケーションでリアルタイムの応答ができません。 アプリケーションはタスクスケジューラによって置き換えられる可能性があり、これは許容できない予測不可能な遅延につながります。 単一のアプリケーションとリアルタイムオペレーティングシステムがマイクロコントローラーで実行されているため、リアルタイムの応答を提供することが可能です。 これは、相互作用プロトコルが短い時間間隔を厳守することに依存する多くのセンサーで動作するために必要です。 組み込みのマイクロコントローラーなしでそれらを接続するには、そのようなセンサーを操作するためのすべての機能を実現するために、別個のマイクロコントローラーを使用する必要があります。 外部マイクロコントローラを備えたIntel Edisonのソリューションの例は、 Intel Edison-Arduino拡張ボード用のSparkFunブロックです 。
メインプロセッサがスリープ状態にあり、マイクロコントローラが特定のイベント(たとえば、センサーからのしきい値を超える)を予期する可能性があるアプリケーションで、マイクロコントローラを使用してエネルギー効率を高めることができます。
必要に応じて、マイクロコントローラはメインプロセッサを起動します。 実装例については、「 MCU SDKおよびAPIの使用:コード例 」 を参照してください。
Intel Edisonマイクロコントローラーを使用する例として、HC-SR04超音波距離センサーの接続を検討してください。 測定された距離は、キャラクター画面Grove LCD RGBバックライトに表示されます。
超音波距離センサーHC-SR04
センサーには4つの出力があります。
- Vcc -5V。
- トリガー-センサーへのトリガー信号。 マイクロコントローラーはセンサーに10マイクロ秒のパルスを与えます。 センサーが測定プロセスを開始します。
- エコー -センサーからマイクロコントローラーへのエコー信号。 パルス持続時間は、測定された距離に比例します。
- Gnd-地球。
オシロスコープ画面でセンサーを操作するプロセスは次のとおりです。
- チャンネル1-トリガー
- チャンネル2-エコー
マイクロコントローラーはTrigにパルスを供給します。 その後、センサーはEchoにインパルスで応答します。
パルス持続時間は、測定された距離に比例します。
測定された距離は、式(センサーの仕様から取得)によって計算されます。
距離(cm)=パルス持続時間エコー(マイクロ秒)/ 58
仕様によれば、センサーは2〜400 cmの距離を測定できます。
リアルタイムで予測誤差を伴うパルス幅を測定することは問題です。
たとえば、スケジューラによって測定プロセスが置き換えられる可能性があり、測定結果が不正確になります。
HC-SR04をIntel Edisonマイクロコントローラーに接続します
使用されるコンポーネント:
- Edison計算モジュール
- エジソンアルドゥイーノボード
- グローブ基本シールド
- キャラクタースクリーングローブLCD RGBバックライト
- 超音波距離センサーHC-SR04
- ブレッドボード
まず、Edison Compute ModuleをEdison Arduinoボードに接続します。 次に、Grove Basic Shield拡張ボードをEdison Arduinoボードに接続します。 Grove LCD RGBバックライトは、Grove Basic ShieldのI2Cコネクタに接続します。
HC-SR04超音波距離センサーは、次のようにGrove Basic Shieldに接続します。
- Vccから+ 5V。
- ピン#3をトリガーします。
- ピン4にエコーします。
- GndからGnd。
ピン3、4はランダムに選択されますが、代わりに他のピンを使用できます。
Intel Edisonファームウェアアップデート
マイクロコントローラーのサポートは、バージョン2.1以降のIntelEdison®ボードファームウェアソフトウェアリリースで利用できます。 ファームウェアが古い場合は、更新する必要があります。
次のコマンドで現在のファームウェアバージョンを確認できます。
# configure_edison --version
この例は、ファームウェアバージョン146で作成されました。
ファームウェアを更新するプロセスの詳細は、 Intel Edisonのフラッシュの記事で説明されています。 個人的には、私は通常、 代替点滅方法のセクションで説明されている方法を使用します。
フラッシュする前に指示を注意深く読んでください。
Ethernet-over-USB経由でIntel Edisonを接続します
MCU SDKからEdisonを使用するには、ネットワーク接続を作成する必要があります。
これを行うには、たとえば、USBケーブルを中央のマイクロUSBポートに接続します(スイッチはマイクロUSBポートの方向にインストールする必要があります)。
Linuxでは、ネットワークは次のコマンドで構成されます。
# ifconfig usb0 192.168.2.2
Intel Edison IPアドレス:
192.168.2.15
接続プロセスの詳細については、記事「 Ethernet over USBを使用したIntel®Edisonボードへの接続」を参照してください 。
MCU SDK
組み込みマイクロコントローラーで実行されるアプリケーションを作成するために、EclipseベースのMCU SDKクロスプラットフォーム開発環境がリリースされました 。 インストールプロセスの詳細については、MCU SDKのインストールの記事を参照してください。
MCU SDKを使用すると、ボードの作成、コンパイル、ダウンロード、およびマイクロコントローラーアプリケーションのデバッグを行うことができます。
MCUインタラクション
Linuxのマイクロコントローラーとやり取りするために、いくつかのインターフェースを使用できます。
/dev/ttymcu0
データ交換用のチャネル。 Linuxでは、標準のファイル操作を使用して作業できます。 マイクロコントローラー上のプログラムから、
host_send
および
host_receive
を使用して交換が実行され
host_receive
。
/dev/ttymcu1
マイクロコントローラー
debug_print
関数
debug_print
デバッグメッセージ
debug_print
送信するチャネル。
/sys/devices/platform/intel_mcu/log_level
デバッグメッセージのレベル(致命的、エラー、警告、情報、デバッグ)を設定できます。
Edison Arduinoボードポートの使用
マイクロコントローラーはEdison Compute Moduleに組み込まれ、モジュールの70ピンコネクターにあるI / Oポートを制御します。
Edison Arduinoボードでマイクロコントローラーを使用する必要がある場合は、Edison Compute ModuleのGPIOポートとEdison Arduinoボードのポート番号の対応を見つける必要があります。
次に、論理レベルコンバーターで多重化を構成し、方向を設定する必要があります。
Linuxレベルでポートを操作する場合、これらすべてのアクションはMRAAライブラリによって実行されます。 マイクロコントローラーの場合、 スクリプト (init_DIG.sh、init_i2c8.sh、init_mcu_PWM.sh、set_DIG.sh、read_DIG.sh、init_UART1.sh)を使用して、これを自分で処理する必要があります。 詳細については、 Intel®Eddu Kit for Arduino *ハードウェアガイド (表4) を参照してください。
Linuxプログラム
組み込みのマイクロコントローラーからデータを受け取り、文字ディスプレイに表示する小さなPythonスクリプト。 文字表示を操作するには、 UPMライブラリのJhd1313m1モジュールを使用します。
スクリプトshow_distance.py:
import time import pyupm_i2clcd RET_ERROR = -1 if __name__ == '__main__': lcd = pyupm_i2clcd.Jhd1313m1(6, 0x3E, 0x62) with open('/dev/ttymcu0', 'w+t') as f: while True: f.write('get_distance\n') # Send command to MCU f.flush() line = f.readline() # Read response from MCU, -1 = ERROR value = int(line.strip('\n\r\t ')) lcd.clear() if value == RET_ERROR: lcd.setColor(255, 0, 0) # RED lcd.write('ERROR') else: lcd.setColor(0, 255, 0) # GREEN lcd.write('%d cm' % (value,)) time.sleep(1)
マイクロコントローラー用のプログラム
マイクロコントローラー上のプログラムは、ホストからget_distanceコマンドを受信すると、距離を測定し、結果をホストに送信する必要があります(センチメートル単位の距離、またはエラーの場合は-1)。
Edison Arduinoボードのポートの構成:
./init_DIG.sh -o 3 -d output ./init_DIG.sh -o 4 -d input
マイクロコントローラはEdison Compute ModuleのGPIOポートで動作することを思い出させてください。EdisonArduinoボードの番号とは異なります。 たとえば、 MCUを使用してLEDを点滅させる記事の最後に、対応表があります 。
MCU SDKのマイクロコントローラー用プログラム:
#include "mcu_api.h" #include "mcu_errno.h" // Arduino Extension PIN = 3 #define TRIG 12 // Arduino Extension PIN = 4 #define ECHO 129 // From HC-SR04 datasheet #define MIN_DISTANCE 2 #define MAX_DISTANCE 400 #define MAX_WAIT 10000 #define RET_ERROR -1 int get_distance() { // Send Trig signal to HC-SR04 gpio_write(TRIG, 1); mcu_delay(10); gpio_write(TRIG, 0); // Read Echo signal from HC-SR04 int i; i = 0; while ((gpio_read(ECHO) == 0) && (i < MAX_WAIT)) { mcu_delay(1); i++; } unsigned long t0 = time_us(); if (gpio_read(ECHO) == 0 || i == MAX_WAIT) { return RET_ERROR; } i = 0; while ((gpio_read(ECHO) == 1) && (i < MAX_WAIT)) { mcu_delay(1); i++; } unsigned long t1 = time_us(); if (gpio_read(ECHO) == 1 || i == MAX_WAIT) { return RET_ERROR; } unsigned long distance = (t1 - t0) / 58; if (MIN_DISTANCE < distance && distance < MAX_DISTANCE) { return distance; } else { return RET_ERROR; } } #define MAX_BUF 255 unsigned char buf[MAX_BUF]; void mcu_main() { // Setup Trig as OUTPUT gpio_setup(TRIG, 1); // Initially set Trig to LOW gpio_write(TRIG, 0); // Setup Echo as INPUT gpio_setup(ECHO, 0); while (1) { unsigned int len; len = host_receive(buf, MAX_BUF); if ((len >= 12) && (strncmp(buf, "get_distance", 12) == 0)) { unsigned int distance; distance = get_distance(); len = mcu_snprintf(buf, MAX_BUF, "%d\n", distance); host_send(buf, len); } } }
自動実行するスクリプトを追加する
スクリプトを実行するファイルを作成します。
ファイル/home/root/startup.sh
#!/bin/bash cd /home/root # configure PIN3 as GPIO OUPUT (TRIG signal) ./init_DIG.sh -o 3 -d output # configure PIN4 as GPIO INPUT (ECHO signal) ./init_DIG.sh -o 4 -d input python show_distance.py
スクリプトを実行可能としてマークします。
# chmod a+x /home/root/startup.sh # chmod a+x /home/root/init_DIG.sh
Yocto Linuxはsystemdを使用するため、スクリプトを自動起動に追加するには、いわゆる「サービス」のファイルを作成する必要があります。
ファイル/lib/systemd/system/startup-script.serviceを作成します
[単位]
説明=スタートアップユーザースクリプト
後= syslog.target
[サービス]
ExecStart = / home / root / startup.sh
[インストール]
WantedBy = multi-user.target
説明=スタートアップユーザースクリプト
後= syslog.target
[サービス]
ExecStart = / home / root / startup.sh
[インストール]
WantedBy = multi-user.target
自動実行するスクリプトを追加します。
# systemctl enable startup-script
再起動後、測定された距離がシンボルディスプレイに表示されます。
使用したリソース
- Intel Edison Boardソフトウェアのダウンロード
- Intel Edison向けSparkFunブロック-Arduino
- MCU SDKおよびAPIの使用:コード例
- Intel®EdisonボードとArduino拡張ボードの組み立て
- Intel Edisonの点滅
- Ethernet over USBを使用してIntel®Edisonボードに接続する
- MCU SDK
- MCU SDKのインストール
- MRAAライブラリ
- Arduino用Intel Edisonキットハードウェアガイド
- MCU SDKのサンプルスクリプト
- UPMライブラリ
- UPM:Jhd1313m1モジュール
- MCUを使用したLEDの点滅