Superb Garbages 2

千野純一(chinorin)のはてなダイアリーの続きです。

Maix Amigoを入手したので戯言

  • https://www.marutsu.co.jp/pc/i/2195810/
  • これでも一応、マイコンマイコンだけど、実際はこれ、OSの入ってないスマホ*1と言っていいと思う。肝心の無線関連の機能は内蔵されてないんだけど、マイコンだからそんなのいくらでもくっつけられるし。MPUのコアはRISC-V(リスクファイブ)っていう、x86でもARMでもない第3の命令セットとか言われてるオープンソースアーキテクチャのやつ。
  • 打倒・iPhoneAndroid みたいな勢いを感じるのは俺だけだろうか。Sipeedはやっぱり中国の会社で、設立はなんと2018年。当初からRISC-Vを扱ってるみたいなんだけど、こうやってペリフェラル*2満載のマシンにRISC-Vが載ってると迫力が違うよね。
  • こういう、単純に山盛りにしたマイコンというのは泥臭いよ。確かに泥臭い。前述の通りOSも用意されてないし*3、そもそも開発環境すらちゃんと整ってないらしい。そのへんはほとんどユーザ任せだ。でも、機械自体が面白ければ環境含めて開発してくれるユーザはいくらでもいるわけで。
  • 日本のメーカは、こういうのはもう作れないんだろうねえ。まー日本のマイコンメーカってもうルネサスくらいしかないんだと思うけど、すごいぼんやり思うのは、過去のいつかのタイミングでなんかこーいうの作って欲しかったなあ、みたいな⋯。SH-4*4とかでね。w
  • それに国産なら日本語のドキュメントが手に入るというのがでかい。w というわけで今回も、日本語に翻訳してくれる人が現れない限り、中国語の字面を見てなんとなく意味を察したり、がんばって英語を読まなきゃいけない。もちろんGoogle先生もめっちゃ手伝ってくれるけど。

 

  • っていうか、中国のこの試みはある程度大きな展開を見せる可能性があるんじゃないかと思ってる。一歩目は残念ながら逃した感じだけど、これについていく日本のメーカは現れないものだろうか。一応ルネサスRISC-Vは視野に入れてるようだが、結局アメリカの会社にライセンス料払ってるみたいだし(フリーのアーキテクチャなのに!w)、なんとなくだめだこりゃって思っちゃうよねこれ。
  • それとも国際的圧力の関係で、こういうのは中国にしかできないのか?

*1:電話が使えないとスマホって言っちゃいけないのかな。なら、小型タブレット

*2:ペリフェラル:周辺機器のこと。狭義では、マイコンボードに搭載されたMPU以外の機器のこと。

*3:Ubuntuを動かした人がいるみたいだけど

*4:SH-4:ドリームキャストに使われてたMPU

インピーダンスを理解したい&マイコンについての説明2

  • インピーダンスとは、ある回路全体における「交流にとっての抵抗値」である。オームの法則により導かれる数値(電圧÷電流)と、コイルによって発生する誘導性リアクタンス、それからコンデンサによって発生する容量性リアクタンスを全て足したもので、単位は直流抵抗と同じΩ(オーム)。
  • 「ロー出しハイ受け」という言葉がある。何らかの信号や波形などを扱うとき、それを発生させる側の回路はインピーダンスをより低く、それを受け取る側の回路はインピーダンスをより高くしましょう、といった意味だ。
  • インピーダンス=抵抗。ということは、低いところから出して高いところへ入れると減衰してしまって不利ではないか? ⋯と思ってしまうのだがそうではない。
  • 波形として運ばれてくる情報は電圧の強弱で表現される。発生回路と受け取り回路を直列に繋いだ回路全体を考えると、電圧は分圧され、抵抗値の高い部分により高い電圧がかかるというのはオームの法則が示す通りである。
  • なので、高いインピーダンスをもって波形を受け取った方が、発生した情報をロスなく検知・利用することができる⋯⋯のか?
  • 正しいのかどうかは知らんけど、こんな風な説明もできるみたい:交流は波動なので、何もないところは伝わりにくい。「波動を媒介する何か」が必要で、その濃度のようなものがインピーダンスだと考えてみる。その中では確かに電流は減衰するが、波動が持っている情報はより伝わりやすくなる⋯⋯のか?
  • PAやスピーカー等、情報を受ける側のインピーダンス値が高くあるべき理由はもうひとつあって、インピーダンスが高い=多くの情報を取り出しているということ。なので一般に、インピーダンスの高いスピーカーの方が高精細な傾向がある⋯⋯のか?
  • ほんとかなあ。どーにも直感的じゃなくて、どういう理解をすれば正しいのかよーわからん。リアクタンスが交流を妨げるってところまではなんとなくわかるんだけどねえ。


  • ワンボードマイコンというのはつまり何なのか、別角度からの説明。
  • つまりパソコンのサブセットなんですよね。「パソコンから処理系だけを抜き出したもの」という説明がけっこう近いものをイメージできるのではないか。
  • パソコンの場合、入力(キーボード、マウス等)、出力(ディスプレイ、プリンタ、サウンド等)、それからOSやある意味アプリケーションソフトについても、ある程度決められたものが最初から搭載されていたり、出来合いのものを使うのが普通です。
  • マイコンの場合それらは必須のものではなく、目的に応じて必要なものだけを用意します。たいていOSもないので、自分で作ったひとつのプログラムを単体で動かします。何かのしきたりみたいなものに従う必要も基本的にはありません。
  • また、PC界隈では扱う習慣がないアナログ寄りのデバイス*1と相性がよいことも重要な点でしょう。
  • 例えばキッチンタイマーフルHD液晶やキーボードは不要ですよね。いくつかのボタンと、3桁くらいのセグメントLCD*2 *3と、時間がきたら鳴るブザー的なものがあれば充分でしょう。
  • それでいて、何かのデバイスを「使ってはいけない」という決まりもないので、キッチンタイマーフルHD液晶やキーボードをつけることももちろん可能です。何かそれを生かす素晴らしいアイデアがない限り邪魔で仕方ないでしょうけど。
  • 最初からひととおりぜんぶつけといて、使わない機能は実装時に省くというアプローチもあるかもしれません*4。が、そのためには当然それらを接続する仕組みをぜんぶ内蔵しなければならないわけで、小規模な組み込み案件においては無駄が多そうな気がします。マイコンは、より単純でより安価、より省スペースでより省エネ(電池で動かすことも多いし)な実装が好まれがちです。たぶん。
  • 「たぶん」というのは、近年マイコン界隈でもM5StackシリーズやWio Terminalのように液晶画面などそれなりのマンインターフェースを最初から搭載し、見た目も基板むき出しではなくきっちりした綺麗な筐体で覆われたものをちょくちょく見かけるからです。
  • そういうのを触ってるとマイコンともシングルボードコンピュータともまた違った流れを感じるのですが、全て中国発というのが少し興味深いんですよね。ITやIoTにおける何か大きな流れを示しているような気がしてなりません。

 

  • 最後に。現在のわたくし個人としては、開発の面白さを マイコンシングルボードコンピュータ*5>PC だと感じております。
  • なぜPCよりマイコンの方が面白いか。そこに直結している最大の理由が制限の多さです。今のPCのソフト開発は制限がない*6ので自由過ぎて何も作れねーんだ。「この部分はここまでしかできませーん」と言ってくれた方が自分がこれから作るものについてのイメージが湧きやすいし、その制限自体が制作においてとても役立つヒントになったりする。自由過ぎる環境で何かを作れるのは一握りの天才だけだ。我々凡人においては制限がクリエイティブを生むのである。よく覚えておくがいい。
  • それから前にも言ったけどデジタルとアナログの境目の部分をコントロールするというのがなかなか新鮮で、一筋縄ではいかないのがやっぱ面白いのかなあ。PCって命令すれば言うこと聞くんだけど(マイコンも聞くんだけどw)、自分で組んだ電子回路はそうはいかない。試行錯誤の毎日の中で、その試行錯誤が直接目に見えるというのは達成感が得やすいかもしれないね。
  • 色々手間がかからないと意味ないからHONDAは悪*7とか今更そういうことを言うつもりもないんだが、上に書いた液晶画面が最初から載ってるマイコンをはじめ、32ビット化の流れとか、Wi-FiBluetoothの標準搭載など、制限が徐々になくなってきた感じがするのはちょっとだけ心配だ。AVR&Arduinoのようなある意味牧歌的な仕組みがいつまでも残ってるといいんだけどね。

 

  • 次回は「マイコンを使って、物理的にどのようなことができるのか」を説明してみたい。ほんとにできるんだろうか⋯。

*1:温度センサとか、圧力センサとか、超音波センサとか、光センサとか……以上はぜんぶ入力デバイスだけど、出力デバイスで言うとモーターとか

*2:7セグのような、いくつかの「あらかじめ決められた形のカタマリ」しか表示できないような液晶パネル。例えば電卓やデジタル時計の表示器はだいたいこれ

*3:一応「7セグ」について追加説明:「セブン・セグメント」の略で、電卓やデジタル時計の数字を表示するためのあれのこと。ひとつの数字ごとにつけたり消したりする棒が7本あるでしょ? 数えてみてください。アルファベットも表示できる14セグとか16セグとかもあるけど日本ではマイナーかも

*4:Raspberry Piなど、いわゆる「シングルボードコンピュータ」の立場はどちらかというとそっちかも

*5:触ったことねーけど

*6:いや、実際にはあるし、それよりも自分の技術的に手が届く範囲の方が断然狭いんだけど、ということはつまり自分ができることは絶対にぜんぶできるでしょ。その点について自由があり過ぎると言ってる

*7:バイクの話です。自分HONDAのに乗ってたんだけど、SUZUKI乗りの人がよくそんなことを言ってた

Minecraft統合版で半自動釣りマシーンを使った自動釣りスケッチ@M5Stack Basic

  • 気まぐれに。
  • M5Stack Basic@Arduino IDE用、Bluetooth接続の仮想マウスとしてWindows10に接続し、設定した秒数(0.5秒刻み)ごとに右クリックをしてくれるスケッチを雑に書いたので置いときます。Minecraft統合版において、半自動釣り装置を使って釣り放置をするとき用に作ったものです。スコープとか関数とか行き当たりばったりでとにかくテキトーです。動きゃいいのよ動きゃ。
  • M5シリーズはM5Stack Basicしか持ってないので他ので動くかどうかはわかりませんがボタンが3個ついてるやつならたぶん動くんじゃないかという予感はする。で、ホスト側もWindows10の統合版しかテストしてないからわからんが、とにかくBluetooth(ver4.0以降)が繋がって、右クリックがアイテムを使う操作ならばいけるんじゃないかな? PS4とかどうなんだろう。
  • M5Stackのボードマネージャを入れたArduino IDEと、それからESP32用のライブラリ BLE-Mouse が必要です。導入方法は、前者はM5Stack関係のマニュアル的な文書に書いてある。後者もぐぐればどっかに書いてあると思うけど、簡単に説明すると、例えば、
    1. リンク先の「↓Code▼」って書いてある緑のボタン → Download ZIP をクリックして任意の場所にファイルをダウンロード
    2. Arduino IDEの「スケッチ → ライブラリをインクルード → .ZIP形式のライブラリをインストール」で先ほどダウンロードしたファイルを指定
  • ⋯で入るかな? 入ってれば スケッチ → ライブラリをインクルード の中の「提供されたライブラリ」の項目に「ESP32 BLE Mouse」というのが出てるはずだけどこういうの探すのけっこうめんどいんだよね。とりあえずコンパイルしてみればいいんじゃないかな⋯。
  • 例によって著作権は主張しませんがご利用は自己責任で。
// For M5Stack Basic @ Arduino IDE,
//   a sketch of right click regularly ("AUTO FISHING" in Minecraft BE)
// "BLE-Mouse" library and Bluetooth(ver4.0 or later) are required.
// Written by Chinorin. No Rights Reserved.

#include <M5Stack.h>
#include <BleMouse.h>
BleMouse bleMouse("[ESP32/M5]AUTO FISHING","Chinorin");
bool blestate=false,fishswitch=false;
unsigned long starttime;
float castingsec=5.5;

void setup() {
	M5.begin();
	bleMouse.begin();
	M5.Power.begin();
	bleMouse.begin();

	M5.Lcd.setBrightness(100);
	M5.Lcd.fillScreen(BLACK);

	M5.Lcd.setTextColor(WHITE);
	M5.Lcd.setTextSize(3);
	M5.Lcd.setCursor(10,10);
	M5.Lcd.print("=AUTO FISHING=");
	M5.Lcd.setCursor(10,35);
	M5.Lcd.print("RightClick Tool");

	bledisp();
	castingsecdisp(castingsec);
	menudisp();
	starttime=millis();
}

void menudisp(){
	M5.Lcd.setTextSize(2);
	M5.Lcd.setCursor(0,225);
	if(blestate){
		M5.Lcd.setTextColor(WHITE);
		M5.Lcd.print("START/STOP");
	} else {
		M5.Lcd.setTextColor(DARKGREY);
		M5.Lcd.print("START/STOP");
	}
	M5.Lcd.setCursor(120,225);
	M5.Lcd.setTextColor(WHITE);
	M5.Lcd.print(" -0.5    +0.5");

	M5.Lcd.setTextSize(3);
}

void bledisp(){
	M5.Lcd.fillRect(0,85,320,30,BLACK);
	M5.Lcd.setCursor(10,85);
	if(blestate){
		M5.Lcd.setTextColor(YELLOW);
		M5.Lcd.print("CONNECT");
		M5.Lcd.setTextSize(1);
		M5.Lcd.setCursor(10,107);
		M5.Lcd.setTextSize(3);
	} else {
		M5.Lcd.setTextColor(RED);
		M5.Lcd.print("DISCONNECT");
	}
}

const int py=170;
const int psize=20;

void progress_erase(){
	M5.Lcd.fillRect(0,py,320,psize,BLACK);
}

void progress(int val){
	M5.Lcd.progressBar(0,py,320,psize,val);
}

void castingsecdisp(float sec){
	int a,b=0;
	M5.Lcd.fillRect(0,135,320,22,BLACK);
	M5.Lcd.setCursor(10,135);
	a=sec;
	if(a<sec) b=5;
	M5.Lcd.setTextColor(WHITE);
	M5.Lcd.printf("Interval: %d.%d sec",a,b);
}

void casting(){
	bleMouse.press(MOUSE_RIGHT);
	delay(100);
	bleMouse.release(MOUSE_RIGHT);
}

void loop() {
	M5.update();

	if(M5.BtnA.wasPressed()){

		if(fishswitch){
			fishswitch=false;
			progress_erase();
		} else {
			fishswitch=true;
			casting();
			starttime=millis();
		}

	} else if(M5.BtnB.wasPressed()){
		if(castingsec>0.5){
			castingsec-=0.5;
		}
		castingsecdisp(castingsec);
	} else if(M5.BtnC.wasPressed()){
		if(castingsec<20.0){
			castingsec+=0.5;
		}
		castingsecdisp(castingsec);
	}

	if(blestate != bleMouse.isConnected()){
		blestate = !blestate;
		bledisp();
		menudisp();
	}

	if(fishswitch){
		unsigned long now=millis()-starttime,next=castingsec*1000;
		progress(now*100/next);
		if( next <= now ){
			casting();
			starttime=millis();
			progress_erase();

		}
	} else {
		delay(1);
	}
}
  • 精査してないけど定義するだけして使ってない変数とかあるかも。w そんなんプログラムあるあるだろ。いいんだよ動きゃ。
  • スケッチをコンパイルして転送したら、まずはホスト側(例えばWindows)のBluetoothの設定で [ESP32/M5]AUTO FISHING というデバイスとペアリングしてください。するとM5Stack側で DISCONNECT だった表示が CONNECT になります。
  • その状態で、Minecraft内で釣り竿を持って、釣り施設の所定の位置にカーソルを合わせ、そんでM5StackのAボタン(一番左のボタン)を押すと自動釣りがスタートします。まず1回右クリック操作が入り(念のためクリック操作自体に0.1秒かけてます)、その後設定秒数だけ待ってふたたび右クリック。その繰り返しです。もう一度Aボタンを押すと停止します。
  • 再スタートもAボタンです。再スタート時もまず最初に右クリック操作が行われることに注意してください。現在動いてるか止まってるかは青いプログレスバーを見てください。
  • BボタンとCボタンで設定秒数を0.5秒刻みで増減します。最少0.5秒、最大20秒です。この操作はいつでも(自動釣りが動いてる間でも)できます。[入れ食いIII]の釣り竿を持っている場合は5~5.5秒くらいがおすすめです。それ以外の場合はいい感じに調整してください。
  • たまに、プログレスバーは動いてるのに釣りができていない(右クリックできない)場合があります。そのときはM5Stackをリセットすると直ります。ご存じでしょうが左側面の赤いボタンです。

 

  • ちなみにその赤いボタンを素早く2回押すと電源オフなんだけど、しばらくその方法がわかんなくて、電源落としたいときはわざわざバッテリー(下の段)抜いてた。普通長押しじゃんよ⋯⋯という。でもSeeeduino XIAOもリセットパッドを素早く2回導通みたいな操作があるので、中国ではわりとメジャーなやり方なのだろうか。
  • しかし、しかしだよ。こんなのを適当に作ってみたはいいけれど、マイコンに標準搭載されたディスプレイに状況を表示しながら右クリックを送信なんて、そもそもマイコン使う意味ねーじゃねーかとひととおりできあがってから思いましたとさ。だってこんなのWindowsのソフトとして作ればいいんだし⋯。
  • まあ、ESP32のBluetooth周りの習作ということで。いやそれにしても接続やら何やらBLE-Mouseが自動的にぜんぶやってくれるから俺なんもしてないしブツブツ⋯。
  • そんでESP32用のスケッチのコンパイルって遅いねえ。ライブラリ探すのになんでそんなに時間かかるのか知らんけど、そんなことやってないでまず最初にSyntaxをざっと見てくんねえかな。めっちゃ待ったのに「カッコ閉じてません」で止まるの切ないのよ。

 

  • そんで肝心の自動釣り設備の話ですけど、ええと、どうしたらいいかな。まず地面から3~4ブロック上くらいのいい感じの場所にチェストを⋯⋯
  • もうめんどくさくなった。所長氏の動画を貼っておく。所員氏の給料のために見てあげて。

  • 当然いろんな作り方があるんだけど、自分の場合は何が釣れたのかわからないのが嫌なので、一番下のチェストの代わりにホッパーとかドロッパーとかをごにょごにょやって、チェストの奥側で釣れたものが浮き上がってきて正面のチェストに入るのが見える、という仕組みにしたりします。浮かせる方法はソウルサンド+水でもいいけど、ガラスで埋めた3x3の空間の真ん中に下からドロッパーで吐き出すってのもなかなかオツなものだ。で、一番上で水を流してホッパーで回収。

マイコンというものを説明してみる試み

  • 確かになんつーか、このblogにおけるここ数ヶ月の文章を読み返してみると、全体的によくわからないことが書いてあるなと感じる。文章がへたくそなのも原因のひとつなんだけど、何よりできるだけ正しく誤解の生まれにくい表現をしようとするとどんどん意味のわからない接続詞みたいなのが増えていってしまうんだ。まー自分のために書いてるから最終的には自分がわかりゃーそれでいいんだけどな。
  • でもまあ少しは反省のような態度を見せつつ、最近よく扱ったり扱わなかったりしているものを基礎から説明してみようか。ほんとにできるんだろうか⋯。
  • ということでまずはマイコンそのものについて。ブラウザによっては、注釈の「*n」はマウスカーソルを乗せるだけでも表示されたりします。

 

  • 最近よくいじってるのはワンボードマイコンというジャンルのコンピュータです。ワンボードマイコンにはCPUとメモリとストレージ*1をワンチップに集積したマイクロコントローラ(ちぢめてマイコン。以下Micro Control Unitの頭字語でMCUと呼ぶことにする)という種類のICあるいはLSIが搭載されており、ボードの中心となるそのチップを活用するためのハードウェアと言えます。
  • そもそもMCUが何のためにあるのかというと、主に組み込み用途です。家電やPCの周辺機器をはじめ、電卓や時計などの各種デバイスやおもちゃ類、小型の多葉式無人ヘリコプター(いわゆるドローン)やラジコンカー、それらを操作するためのリモコンなどなど、電気信号によって動作するあらゆる製品MCUが組み込まれており、その制御を担っています。
  • 様々な用途に使えるMCUですが、前述の通りCPUとメモリとストレージを集積したものに過ぎません。実際に動作するためにはプログラムが必要です。プログラムの制作はWindowsMacintoshLinux等のPCで行いますが、MCU自体はICあるいはLSIの形状をしているので、そのままではPCと接続するのは困難だし、実際の製品の回路設計においても不便です。
  • そこで、PCと接続するためのUSB端子をつけたり、ICやLSIの足(端子)から導線を引っ張って人間が扱いやすいように並べたりしたものがワンボードマイコンです*2。ワンボードマイコンの商品名として「開発ボード」とか「評価ボード」*3といったものをよく見かけるのは、実際にそのような工程で使われるものだからでしょう。
  • 一方、これをホビー用途で購入し、いじくり回して遊ぶ輩が昔から一定数います。例えば誰のことを指しているかは言わなくてもわかるな。また、最近はプログラミング学習だなんだで教育用としての需要も増しているようですね。

 

  • 代表的なワンボードマイコンとしてArduino*4を紹介しておきます。今日はこの名前だけ覚えて帰ってください。
  • Arduinoは、イタリアのメーカ*5から発売されているワンボードマイコンのシリーズで、最初の機種が登場したのは2005年。ホビーや教育分野において一世を風靡した感があり、今なお売れ続けているワンボードマイコンデファクトスタンダードと言えましょう。
  • Arduinoは基本的に、Atmelという会社が作ったAVRという種類のMCUを搭載しています。例えば現在手に入る最もベーシックなモデルArduino UNO R3に載っているMCUATmega328Pです。8ビットのRISCアーキテクチャなチップで、16MHzで動作します。*6
  • そのほか、USBキーボードやUSBマウスなどが簡単に作れるArduino Leonardoや、コンパクトさがウリのArduino Mini/Nano/Microといったもの、拡張性を重視したArduino Mega 2560などなど様々なArduinoが発売されていますが、残念ながらWi-FiBluetoothを搭載した近年のモデルは日本において技適マークを取得しておらず、電波を出すのが違法となるので日本ではほとんど流通していないみたいです。
  • Arduinoの最大の特徴はオープンソースハードウェアを謳っていることだと思います。回路図などは全て公開されており、一定の条件の下、誰もがArduinoを製造し販売することが可能です。かの有名な電子工作の聖地秋月電子などでATmega328Pさえ買ってこれば俺でもそれっぽいものが作れますし、安価な互換機が大量に出回っていることもユーザー層の拡大や技術力の底上げに一役買っているものと思われます。
  • また、Arduinoで動くプログラムを書くための統合開発環境Arduino IDE*7も無料で配布されており、これを使うことでコーディングからコンパイルMCUへの書き込みまで全て行うことができます。対応しているプログラム言語はC/C++に少々アレンジを加えたArduino言語⋯⋯ということなのですが、初心者でも書きやすいように工夫されているだけで実質C/C++そのものと言っていいと思います。ちなみに、Arduino言語で書かれたソースコードスケッチと呼びます。*8
  • このArduino IDEの仕様も公開されていて、定義ファイルやライブラリなどを用意することによってどのようなボードでもArduinoと同じようにあるいはArduinoとして開発ができるようになります。*9 実際、公式/非公式は様々ですがArduino IDEで開発ができるマイコンボードはとてもたくさんあって、やれないボードを探す方が難しいくらいです。*10

 

  • 以上、マイコンというものを説明してみる試みでした。次回はなぜPCではなくマイコンで遊ぶのか、あたりを説明できればいいなと思いますがほんとにできるんだろうか⋯。

*1:パソコンで言うとHDDとかSSDとかにあたる。最近のマイコンでは主にFlashROM(例えばUSBメモリの中に入ってるやつ)が使われてることが多い

*2:言葉としては「シングルボードコンピュータ」と似てるけど別物。違いは、例えばワンボードマイコンはOSが不要

*3:「評価」というのはおそらく開発に先立ってMCUの性能や機能を試し、これから作ろうとしているi製品に相応しいMCUなのか確かめるみたいな意味

*4:アルデュイーノあるいはアルディーノと読む。日本では自信なさげにその中間的な発音をする人が多いらしい

*5:メーカ名も「Arduino

*6:マイコンは基本的にRISCが多い。当てはまらないのはZ80系とか8051系とかのいかにもレガシーなやつと、特殊なやつでたまーーーにx86系を見かけるくらいかな?

*7:Windows版、Macintosh版、Linux版各種揃ってまっせ

*8:スケッチはなぜかCっぽく書くのが普通らしく、C++っぽく書かれたものはほとんど見かけない

*9:あるボードをArduino IDEに対応させることを俗に「◯◯のArduino化」みたいな言い方をすることがある

*10:言い過ぎかも

PICの結論とATtiny13A計画

  • 前回のPIC話の続き)いやーこれらってなんか書き込み用のハードウェアみたいなやつがまずあった上で、その先に繋いで焼くやつではないの? 結局ウン千円するPICkitが必要でしたとかだったら目も当てられんぞ。
  • まーね、もしそれ単体でいけたとしても、ただでさえいくつも入ってる統合開発環境をまた新しく増やしたくないし、なーんかPIC系も調べようとするとまず本が出てくる感じで、ウェブ上の日本語の情報がそこまでたくさん見当たる感じじゃない。ので、調べるの面倒っぽく思える。
  • そんで、個人的にはPIC(触ってないから中身知らんけど)よりAVRを応援したいわけよ。PICに一票入れることはAVR衰退の道だ。それでもしAVRがなくなることになったら悲しいのでPICに手を出すことはしないぞ。ビバ! Atmelユニオン!(意味はない)(しかも古い)
  • 一応解説しときますと、PICとかAVRってのはマイコンのシリーズ名。PICは米Microchip Technology社が、AVRは米Atmel社がそれぞれ製造していましたが2016年AtmelはMicrochip Technologyに買収され消滅しました。現在はPICもAVRもMicrochip Technologyが製造しています。PICはどんなに古いチップでもディスコン(製造終了。こちらの業界で言うところのロットアップ)しない宣言されてるらしいんだけど、元々は敵対プロダクトであるところのAVRについては今後どうなるかわからない。Arduinoがあまりにも有名(?)なので少なくともATmega328P、ATmega32u4あたりは残す価値がありそうだけどもねえ。
  • とりあえずATtiny10あたりはなくなりそうだよね。w

 

  • ところで、先日のロータリーエンコーダデコーダみたいに、ATtiny13A用のスケッチとしてひととおり作り置きしといてもいいなと思うものを考えてみようと思う。
    • 単純なロジックICの代用系。AVRの入力は必ずシュミットトリガらしいので、2回路シュミットトリガインバータ(NOT)、1回路シュミットトリガAND/OR/NAND/NOR/XORあたりは超簡単に作れるだろう。5番ピンの\rm{\overline{RESET}}を無効にすればそれぞれ1回路増やせるんだけど、それ以降プログラムを書き換えるのが難しくなる(不可能ではない)からあんまりやりたくないよね⋯。恒久的に組み込んじゃうならそれでいいけどそもそもテストするのがとても面倒だ。1ピンは共通にして1.5回路みたいにするというのも意外と使い道あるかもしれないし、あるいは3~4入力1回路というのも、そういうICをストックしておこうという気にはあんまりならないのでそれはそれでアリか?
    • 単純じゃないロジック系。例えばTとかDとかのフリップフロップ(Dはクロックコモン?にすることで2回路いける)、立ち下がりのみを検知する4ビット2進カウンタ(繰り上げは最上位ビットを次のやつの入力に入れればOKなはず。リセットはリセットピンを使う。ノイズ対策が超重要)など。⋯⋯シフトレジスタやMUXは2ピン使って2ビットじゃ意味ねーからだめか。
    • 自作曲のメロディIC。これは色んな意味で要研究。PWMが2本あるので2和音は確実にいけるが、普通にプログラムでHIGH/LOW制御して低音限定でいいので1音+何らかのノイズを出力するなどして1音くらいいけねえかなあ。w しかしそんなプログラムがブートローダ含めて1KBに納まるのかどうかというとやっぱムリかね。ここは仕方なくATtiny85を用意するしかねーな⋯!
    • ありふれてはいるがクイズボタンインターフェースとかどうだろうね。出題者のところに親マイコンがあってその下に回答者用の子マイコンをぶら下げる形にするのが普通だろうけど、簡便さのために親マイコンがなくても動く仕組みを考えてみるのも面白いかも。
  • 何にしても基本的には自分用。そんなロジックICとかが必要になったときそれっぽいものをすぐに用意できるという状況にするのが主目的なので、自分で使いやすいように作るのがよろしいだろう。だとすると一番上の「単純なロジックIC」のやつはソース、じゃなかった「スケッチをちょろっといじるだけで色んなのになる」という形で充分か。

 

  • ソースコードには main() があるはずなんだけど、Arduino言語にはそれがなくて最初に1回だけ呼び出される setup() とそれ以降ずっと繰り返す loop() があるのみなので、それはソースではなくスケッチと呼びます」っていう説明がわりと好き。いや、暗黙的にincludeされるファイルに普通に↓こんな感じのが書いてあるらしいんだけどさ。
void main(){
	setup();
	while(1) loop();
}

諦めた結果の統合HIDの設計(妄想)

  • 前回の続き)あるいは、
    1. HIDになり得るマイコンをPC1台につき1個常に接続しておく。(仮に親マイコンと呼ぶ)
    2. マイコンの下には、HIDのインターフェースとなる子マイコン(あるいは単なる関数)を複数ぶら下げる。それらには有効/無効のパラメータがあり、何らかの方法でそれを切り替える。
    3. 有効状態の子マイコン(や関数)は人間からの入力等を受け、PCに対してどういう操作をするのかを親マイコン(や出力プロセス)に通知する。
    4. 通知を受け取った親マイコン(や出力プロセス)が、PCに対して具体的なオペレーションを送信する。
  • こうすればUSB-HID機能をもつマイコンは、今の自分の環境で言うと2台で済むわけだ。なるほど。
  • 問題は子マイコンとの通信をどうするかだ。ちゃんとした汎用的な仕組みを作りたいならI2Cを採用して一般的な仮想キーコードをやりとりするべきだろうが、残念ながら(?)その必要はない。なぜなら設計者は自分で、デバイスを作るのも自分なら利用するのも自分だけだからだ。
  • 最低限のものならキーコードを扱う必要すらなくて、このピンがHIGHになったらA、このピンがHIGHになったらBとかでもMUX的な仕組みを使えばやれないこともない。でもまあここは武士の情けで(?)ASCIIくらいのコードは扱えるようにしてやろうか。本当にASCIIだけなら7ビットでいいんだけど、ある程度のコントロール(これを押しっぱなしにしろとか?)もやりたいので8ビットにしておこうか。
  • 例えばこれをシリアルでやるなら、SPIも魅力的ではあるが二重通信もしないので、クロックとMISO(Master In Slave Out)だけ、しかもどっちもブロードキャストで問題ないのでは?
  • ということはだ。上の方で「有効/無効を切り替える」とか書いたけどそれも必要なくて、親マイコンはブロードキャストで流れてくるキーコードを拾ってPCに出力するだけでいいのか? 複数の子マイコンが同時にキーコードを出力したらめちゃめちゃになるんだが、HIDのボタンを押すのは人間なわけで、ここはそういうことはしないということでどうだろう。w
  • そうしたいのは山々だが自動制御することもたまにはあるので親マイコンが発するbusyピンみたいなのを用意しましょうかねえ。どの子マイコンも普段はいつでも開始コード(ののち続けてキーコード)を発して構わないが、開始コードを見た親マイコンはbusyをHIGHにする(終了コードを見たらLOWにする)ので、自動的なトリガを扱ってる奴はbusyがHIGHの間は必ず待つ。人間トリガの奴もピンが余ってるならbusyを見て待っても構わない。複数の子マイコンが開始コードを同時に発してしまった場合は(10Hzとかじゃない限りそんなことはほぼあり得ないので)諦める。
  • ASCIIのコントロールコードをそのまま参考にして開始コードを 0b 0000 0001 とするならば、それを送信中(つまり8クロック目を待っている間ずっとLOW)の子マイコンもbusyがHIGHになったのを見たら即座に送信を中止し、待機状態に移行する。busyがLOWになったらまた開始コードを最初から送信(つまり8クロック目になるまでLOWのまま待つ)する……ということで安全を確保できるかな?
  • …これって子マイコンもブロードキャストMISOを見てればbusyも不要なのか。キーコードを発信しようとしている子マイコンはブロードキャストMISOを15クロック見て、HIGHを見たら[ここでちょっと待ってもいいし待たなくてもいい]また次の15クロックを見る。15クロックの間何もなければ次のクロックまでにOUTPUTに切り替えて最初の1クロックをHIGHとし、続けてキーコード、最後に終了コード(0b 0000 0100等)を出し、送信を終える。
  • 15クロックという待ち時間をふまえて、同期シリアルの速度も検討してみよう。例えば9600bps(つまり9.6kHz)だと15クロックは約0.0016秒、2400bpsだと0.006秒、300bpsでも0.05秒くらいのもんなのか。忙しいことをする予定もないし、自分用のHIDとしてはそんなんでも全然いけるっしょ。これはわざわざ300ボーの音響カプラを自作するしかねーな!!www
  • というドリームを見ました。実際に作れるのかどうかは知らん。クロック同期ってどうやるんだろ。やっぱ割り込みかね。8ビットなら普通にシフトレジスタ使ってもいいんだが、なんか逆に混乱しそうな気がしないでもない。

 

  • それはそれとして。えーっともしかして、aitendoで600円とか700円とかで売ってるやつでPICの開発できるの? ほんとかよ⋯。
  • っていうかこいつらのインターフェースなんなんだよ。モジュラージャックとか、文化がわからねえ。w 1500円のやつならUSBで繋いであとはソフトがやってくれそうだけど、そもそもPICって基本的に何で書くんだっけ? C?

テスタとオシロとHIDコントローラの値段

  • 近年ロータリースイッチ方式はだいぶ少なくなってきたみたいなんだけど、テスタってなんであんなにガチャガチャガチャガチャ回さなきゃいけないんですかね。あれ回すたびに苦痛で苦痛でしょうがないのは俺だけなんだろうか。一番使うやつ(導通とか抵抗とか)に限ってOFFから一番遠い位置にあるしさ。そんでよく合わせるところ間違えるんだわ。はんだづけした後にテストしてみて全然導通してねえ俺のこのへたくそっぷりを見てくれ!!!! と思ったら隣のhFEチェッカになってんのな。
  • ちょっとオシロスコープが欲しいんすわ。オシロスコープといえばベクタースキャンなわけだがもちろんそんなものはもう売ってないのでラスタースキャンどころかTFTとかのを選ぶことになる。テスタと一緒になってるようなやつもあって、なんとなく便利そうだなあテスタが2台あってもいいよなあと思ってみてもそれもまたガチャガチャテスタなのであった。
  • いや、普通にオシロスコープ単体で充分テスタの代わりになるとは思うんだが。あとほんとどうでもいい上にほんと今更なんだけどデジタルマルチメータのイニシャリズムがDMMでわろた。

 

  • 今、なんか思いついて雑にHID(ヒューマン・インターフェース・デバイス。キーボードやらマウスやらのたぐい)を作ろうとしたら、自分の場合、現実的には以下のようなマイコンボードを使うことになる。
    • Digispark等のV-USBなAVRのボード。300円くらいから。
    • Seeeduino XIAO。650円くらい。
    • Pro Micro。700~1200円くらい。
  • 300円くらいならまあ悪くないんだけど、雑に作るには650円とかは高いと感じてしまうんだよなあ。
  • ちなみにDigisparkはあれから色々試して、V-USBが動かなくなった3枚のうち2枚はふたたび動くようになった(フューズ設定が間違ってたみたい)んだが回路組んでテストしてたらまたすぐに動かない状態に戻ってしまった。残りの1枚はそもそもどうやっても復活させることができず、最後の手段であるところの12Vで強引に書き込むというのをやってもだめだった。
  • この壊れやすさは個体の問題(つまり運)なのかそもそも互換機だからなのかよーわからんが、IC単体ならともかくDigisparkみたいなやつにArduino as ISPコマンドラインで何かを書き込むのはなかなかのめんどくささがあるので、もうあんまりDigisparkを触りたくない気持ち。
  • あるいはなんか変な配線とかしてるかなあ。V5をGNDに直結とかそういうの気をつけてるつもりなんだけど、なんかDigisparkのピン配置ってすげえわかりにくくない?w 何なんだろう、ピンヘッダが上方向に出てるのが慣れない感じなのかな。
  • とすると、次に安いのはXIAOということになるのだが、これがめちゃめちゃオーバースペックでな。Pro Microがまーそこそこの8ビットAVRを乗っけてるのに対して、XIAOはCoretex-M0+コア、今をときめく32ビットARMですぞ!!! まあ、引き出されてるピン数は少ないんだけど⋯。(TX/RXはUSBでHIDするなら使えないのでそれを除くとPro Microは16、XIAOは9)

 

  • 一方、PIC方面だとPIC18っていうのがUSB関連の機能を内蔵してるんでしょ? 単品で220円とかで売ってていいなーと思う。AVRだと結局ATmega32u4しかないみたいで単品で600円くらいするし、何よりm32u4はDIP版がねーんだよなあ。あの、QFPをスーっと4回の直線運動ではんだづけする神業、俺にはとてもできる気がしねー。

 
▼神の所業

www.youtube.com
 

  • なお今からPICに手を出すのもちょっっと躊躇われる。PICライタって8000円とかするじゃん⋯。
  • 「USB HID」とかで検索してるとたまに出てくる激安という噂のCH552とかも国内ではなかなか売ってないみたいだし、その親戚のCH551Gってのが200円くらいだったので試しに買ってみたがやっぱり今ひとつよくわからん。このボード自体は値段の割にけっこう優秀そうだけど、8051系はAVRに比べるとネット上の資料が少ないように思う。本買うのはめんどくさい。
  • なお600~700円くらいのレンジだとなんと、Raspberry PiのPicoはともかくZEROまでもが視野に入ってきたりする。GUIつきのLinuxがちゃんと動いてるのにWindowsの下でHIDとして使うなんて贅沢な⋯⋯みたいに思うけど、使いながら随時挙動を微調整するような用途あるいはテスト環境としてはかなり便利かもしれないね。