M0」の使い方を紹介します。M0のUSB経由でターミナルに接続してみます。M0に搭載された赤色LEDを使ったLチカと、カラーLEDの制御方法を紹介しています。M0を繋いでデータの入出力を行なってみます。M0からターミナルソフトヘデータを送ってみるinput()でターミナルソフトからの入力に応答してみる用意するもの今回もオンボードのLEDを使うだけですので用意するものは前回と同じです。ターミナルソフトを準備する「ターミナルソフト」とは、シリアル通信を使って遠隔にある別のデバイスの操作を行うためのアプリケーションです。IDEもターミナルソフトとして利用することができます。皆様がお使いのPCに合わせて、お好きなターミナルソフトを準備してください。11インチ)で記事を書いていますが、MacOSの場合、OSに標準で「ターミナル」というユーティリティが含まれており、これを今回の「ターミナルソフト」としても利用できますので、利用方法を紹介します。ターミナルは、下記に含まれていますので、まずは起動します。ターミナル起動したターミナルから、下記コマンドを入力してUSBに接続されたシリアルポートを探します。/dev/tty.usb*USBポートに何も接続されていない場合、下記のように表示されます。/dev/tty.usb*と入力すると、下記のようシリアルポート名が表示されます。9600接続に成功すると、一度「ターミナル」の画面がクリアされてシリアル通信で送られてくるデータ表示状態に変わります。M0側から何もデータが送られて来ないと、ターミナルソフトの画面には何も表示されてないと思います。M0からPCへデータ送信するコードを書いてみましょう。下記コードをテキストエディタにコピーして、main.pyというファイル名で保存してください。1time.sleep(1)続けて、main.pyを、マウントされているCIRCUITPYにドラッグ&ドロップします。上書きするか?確認されるので、上書きしてください。M0に先ほどのmain.pyが書き込まれました。秒のような表示が連続してコンソールに出力されたら成功です。コード中のprint()の部分がターミナルソフトへデータ出力している箇所です。コードでは、1秒ごとにカウントアップする変数の内容をprint()を使って出力しています。M0では「標準出力」がUSBシリアルポートに設定されているため、ターミナルソフトで出力結果を受け取ることができます。print()は、文字列や数値を組み合わせた様々な出力形式をサポートしています。下記サイトで`print()の文字列や数値の出力方法について、詳しく解説されていましたので、参考にさせていただきました。M0を反応させてみましょう。M0に転送してください。Falsetime.sleep(0.5)上記コードは、Lチカのコードの途中にinput()による入力待ちを挟んだものです。M0に搭載された赤いLEDが1回点滅するはずです。aなどを入力しても点滅しません。M0へデータが送信されていないためです。このように、Pythonのinput()はブロッキング動作を行います。「点滅しているLEDの点滅を止めずに、ターミナルから入力があったら点滅速度を切り替える」といったノンブロッキングな制御にはinput()は使えないのでしょうか?このあたりで議論になっています。getch()上記スレッドの中で「今動かせる方法」として、Trinket側のUART(GPIO)を使って、UART-USBシリアル変換を経由してPC側のターミナルに接続することで、busio.UARTを使ったノンブロッキングなシリアルデータ送受信方法を紹介しています。Communicationsたしかに、この方法ですと、ArduinoのSerial.read()と全く同じことができます。USBシリアルが搭載されているのに、余計なUART-シリアル変換を使うのは、ちょっといやですね。busio.UARTで、USBシリアルポートが指定できるようになれば、それでも良い気がしますが、それもできないようなので。感じた人が他にも居たらしく、input()を使ってなんとかする方法をプルリクしたようです。input()]というわけで、上記プルリクを上げてくれたBillの方法を試してみたいと思います。releaseを見ると、Ver.4.0.0α2がPre-Releaseされており、こちらには含まれているようです。M0に書き込んでください。アップデートする」と同じやり方でOKです。4.0.0αへのファームウエアアップデートが終わったら、下記コードを書き込んでみてください。Falsetime.sleep(sleepTime)こんな感じ↓に動かせたら成功です!注意:今回試したコードは、正確には「input()のノンブロッキング動作」ができるようになるわけではなく、input()前にsupervisor.runtime.serial_bytes_availableを判定することで、すでに入力データがきているときだけinput()で入力処理をさせる、という流れにすることで、ユーザー入力の待ち合わせを回避するハックです。input()が入力の終了と見なす文字(改行)を含めないようなデータを流すと、supervisor.runtime.serial_bytes_availableがtrueになるのに、input()はブロッキングする、という現象は発生します。M0をUSBケーブルでPCと繋いでターミナルソフトを使った入出力を試してみました。最初何から見てみようかな?(まだ考えてないので、お楽しみに!)参考URL下記情報を参考にさせていただきました!貴重な情報公開ありがとうございます。コメントをキャンセルメールアドレスが公開されることはありません。*サイトAuthor@tadfmac横浜でゆるりとモノやオトを作ってます。