ch552tでvendor specificなUSB-GPIBアダプタ
先日,ch552tを使ってUSB-GPIBアダプタを作ったが,これにはいくつかの欠点があった. RENが制御出来ないのは,ch552tのピンの数の問題なので仕方がないが,binary通信が出来ないとか,データは256バイトまでしか扱えないとか,パラレルポールが出来ないなどである. binary通信は特殊文字をエスケープするとかの処理をすれば可能であり,データサイズもバッファを増やしたりバッファサイズで区切って処理することで対応でき,パラレルポールに関しては適切にプログラムを書けば対応はできるはずだ. しかし,それらのためにはマイコンのプログラムを書き換える必要があり,c言語で実装するのが面倒である.
vendor specificな機器の作り方も分かったので,それを応用すればこれらの問題を解消したUSB-GPIBアダプタが作れるのでは無いかと思ったので,作ってみた. ハードは以前のままで,マイコンのソフトだけを入れ替えれば良い. hand shake以外の制御信号はcontrol transferを使って制御し,データの転送はbulk transferを使って行って,マイコンがhand shakeをするというように設計した. データはバッファサイズである64バイト毎に区切られるが,GPIB側の処理が終わったらACKとすることで,大きなデータも扱うことができるようになる. multi-lineコマンドも,ATNしてからbulk transferしてATNを下げるという方法で実現している. PC側のソフトはrubyで書いてみた. デバイスにアクセスするためには,権限の問題がある場合もあるが,ch55xduinoのインストール時に設定していれば問題無い. マイコンとPCのソフトは,私のhomepageのツールの装置制御とマイコンのところにあるので,ここでは割愛する. まだ,検証が十分では無いので,細かいバグは残っているかも知れないが.
原理的には他のUSB-GPIBアダプタと互換性のあるものも作れるかも知れないが,プロトコルを解析するのも面倒だし,使う分には独自の仕様で十分だろう. GPIBを使い始めて以来,様々なGPIBアダプタを作って来たが,ほぼ満足できる仕様になったと考えている. 価格面ではこれ以上下げるのはほぼ不可能だし,RENが使えない以外で性能的には問題無い. PC側のソフトはまだ改善の余地はあるし,ハードを簡単に作れるような基板なども設計すれば,さらに良いものができるかも知れない. しかし,世の中にはすでに様々なGPIBアダプタがあるので,このアダプタが広まる可能性は低いとは思うが,今後GPIBを使うときには,活用して行こうと思う.
ch55xduinoを使ってch552で独自のUSB機器
CH552Tを用いたGPIBアダプタ
ch55xduinoの特徴
先日からCH552Tをいじり始めたが,開発環境としては,ch552xduinoが良いように思えたので,使ってみた. 多少はその特徴が分かってきたので,メモを残しておく.
まず,Arduino IDEを立ち上げて,File - Preferencesとして,Additional Boards Manager URLsのところに,以下のどちらかのURLを追加する.
https://raw.githubusercontent.com/DeqingSun/ch55xduino/ch55xduino/package_ch55xduino_mcs51_index.json https://raw.githubusercontent.com/WeActTC/ch55xduino/ch55xduino/package_ch55xduino_mcs51_index.json
私は開発者のものである前者を選んだ. そして,Tools - Board:… - Boards Managerから,ch552で検索して,CH55xDuino MCS51 plain C core (non-C++)をインストールする. Linuxの場合には,権限の問題をクリアするために,以下のコマンドを実行する.
sudo cp ~/.arduino15/packages/CH55xDuino/tools/MCS51Tools/20??.??.??/linux/99-ch55xbl.rules /etc/udev/rules.d/ sudo udevadm control --reload-rules sudo udevadm trigger
これでインストールは完了である.
Arduinoでは,Tools - Board - CH55x Boards - CH552 Boardとして,その下のClock Sourceは24MHz (internal) 5Vを選ぶ. プログラムを作ったら,DFUモードにして書き込む. 具体的には,P3.6を3.3Vにpull upした状態で,USBコネクタを接続して,すぐに書き込む. 開発ボードには,それ用のボタンがあるので,ボタンを押したままUSBコネクタを接続すれば良い. USB Settingsがdefault CDCの場合には,二回目の書き込みからは,そのままで書き込める.
通常のArduinoはC++だが,ch55xduinoはC言語である. これは,このCPUのフリーのC++コンパイラが無いかららしい. そのためもあり,多少書き方に特徴がある. 他のサイトにも書いてあることだが,ピンは二桁の数字で指定する. ピンのmodeは,INPUT,OUTPUT,INPUT_PULLUPに加えてOUTPUT_ODがある. 最後のはopen drain出力である. USBSerial.printなどの代わりにUSBSerial_printなどを使う. それから文字列については以下の次の段落にあるように注意が必要である. これらの違いを意識するだけで,それなりのプログラムは書けると思う.
文字列は少し癖がある. そのため,文字列をポインタを使って指定して表示しようとしたら,最初はerrorが出てうまく行かなかった. ch55xduinoの表示ルーチンでは,genericという機能を使って,表示したいものの型を判定して,呼び出す関数を切り替えて,適切に表示されるようにしている. そのソースを見てみると,文字列には,__code char *c,__data char *c,__xdata char *cの三つの種類があり,errorはそれがきちんと指定されていないから起こっていることが分かった. ch552には,256byteの内部RAMと1024byteの外部RAMがあり,前者は__data,後者は__xdataというように指定する. ちなみに,内部RAMのほとんどは別の用途に使うので,通常の変数は外部RAMに置かれるが,速い応答が必要な変数は,__dataで指定することによって,内部RAMに置くこともできる. 一方,プログラム本体はプログラムROMというflashにある. その部分に書かれた文字列が,__codeという指定をするのだろう. 文字列はそれがどのメモリにあるかを適切に指定しなけらばならない. 私の今回の場合はポインタの指定に__codeを加えることによって,うまく動くようになった. 普段は,charの配列に__xdataをつけて__xdata charとしておけば,問題無いことが多い.
CH552TのRSTピンを入力用に使う
Debian13でrubyからGPIB制御
texの太字が目立たない
debianのtexで文章を書いているのだが,\bfや\textbfにしても,全く目立たないという問題があった. fontの指定の仕方をいろいろと調べたりしてみたが,最終的には以下のようなコマンドを実行したら,うまく表示されるようになった.
sudo kanji-config-updmap-sys auto
texの設定は難しいな.
ESPでhttps
Gimpのスクリプト
画像を加工するときには,gimpを時々使っている. 単純な作業を繰り返し行うときには,自動化すると便利である. Gimpでは,以前からscript-fuというスクリプトが使えて,自動化することが出来たが,これはschemeという言語を使っているので,それに不慣れなので,あまり使いやすくは無かった. schemeは,括弧を沢山使う言語で,配列やループなどを使うのが大変で,少なくとも私には複雑な処理をするスクリプトを作るのは困難だった. しかし,最近のgimpには,python-fuが組み込まれていて,pythonを使ってスクリプトを書くことができる. Debian13では,Gimp 3.0になっているし,少し古いubuntuでも,snapで3.0をインストールすることができ,python-fuを使うことができる.
python-fuは,Filters - Development - Python-Fu - PythonConsoleでコンソールを立ち上げて,そこから使うことができる. プログラム自体はpythonが使えれば問題無いのだが,少しクセもある. GimpのコマンドはHelp - Procedure Browserから調べることができるのだが,そのままでは使えないのである. 例えば,現在openしている画像のリストを得るgimp-get-imagesというコマンドは,python-fuでは,Gimp.get_imagesとなる. もう一つ例を挙げておくとgimp-image-get-layersは,Gimp.Image.get_layersとなる. “-“が”_“になるのはまだ良いとして,“gimp-“が"Gimp.“などとなるのは,moduleやクラスの名前となっているからのようです. 他にも,Gimp.SelectionやGimp.DrawableやGimp.Channelなどがあるようである.
また,python-fuで作ったスクリプトをメニューなどに登録する方法がまだ分かっていない. 今後は,script-fuよりもpython-fuを使うようになると思う.