CH552Tを用いたGPIBアダプタ

これまでに様々なGPIBアダプタを作ってきたが,低コストで楽にGPIBアダプタを作れないかと考えていたところ,WCH社のCH552Tを使うと新たなものが作れると気がついた. CH552TはUSBと直接接続でき,それ以外に14pinの入出力と1pinの入力を扱うことができる. GPIBは,8本のデータバスと,8本の制御線からなる. GPIBのコントローラーを作るには,12本の入出力,3本の出力,1本の入力が必要である. これをCH552Tで実現するためには,足りない1本の線を省略しなければならない. 省略できる線としては,三つの可能性が考えられる. ASCIIデータのみを扱うことにして8bit目のDIO8を省略するか, Interface ClearをしないことにしてIFCを省略するか, Remote Enableをoffにするのを諦めてRENをGNDに落とすかである. この中で最もデメリットが少ないのは,最後の案であると思われるので,それを採用して,GPIBのコントローラーを作ってみた. CH552TにUSBケーブルのGNDと5Vと二本のdata線を接続して,GNDと5Vの間およびGNDと3.3Vの間に0.1uFのコンデンサを繋ぐと,USBで認識できるようになる. そして,省略するRENと入力のSRQ以外の14本の信号線に,14本の入出力ピンを割り当てる. SRQには入力ピンであるRSTピンを使うが,そのためにch55xtoolなどを使ってRST機能を無効にしなければならない. CH552TのパッケージはSSOP20であるが,DIPへの変換基板を使うと,24ピンのアンフェノール(セントロニクス)コネクタにギリギリ入るので,コネクタからUSBケーブルが出ているだけの,スッキリとした形にできる. あとはプログラムであるが,Arduino UNOやnano用に書いたものをch55xduino用に書き換えた. SerialからUSBSerialになるので,ボーレートの設定は不要である. GPIBの信号線は,プルアップしてオープンドレインとすると良いが,これはpinModeをINPUT_PULLUPとすると実現できる. 他にもいくつかの変更を行ったが,折角なのでシリアルポールの機能も追加してみた. その機能はまだ動作確認をしていないので,うまく動くかは分からないが. そのプログラムが以下のようなものである. // USB to GPIB converter using CH552T #include <string.h> #define DIO1 32 // CH552T 1, GPIB 1 : I/O data bit 1 #define DIO2 14 // CH552T 2, GPIB 2 : I/O data bit 2 #define DIO3 15 // CH552T 3, GPIB 3 : I/O data bit 3 #define DIO4 16 // CH552T 4, GPIB 4 : I/O data bit 4 #define EOI 17 // CH552T 5, GPIB 5 : End Or Identify #define DAV 10 // CH552T 7, GPIB 6 : DAta Valid #define NRFD 11 // CH552T 8, GPIB 7 : Not Ready For Data #define NDAC 31 // CH552T 9, GPIB 8 : Not Data ACcepted #define IFC 30 // CH552T 10, GPIB 9 : InterFace Clear #define SRQ bRST // CH552T 6, GPIB 10 : Service ReQuest #define ATN 33 // CH552T 11, GPIB 11 : ATteNtion // shield GND //USB shield, GPIB 12 #define DIO5 12 // CH552T 17, GPIB 13 : I/O data bit 5 #define DIO6 13 // CH552T 16, GPIB 14 : I/O data bit 6 #define DIO7 35 // CH552T 13, GPIB 15 : I/O data bit 7 #define DIO8 34 // CH552T 12, GPIB 16 : I/O data bit 8 #define REN 9 // CH552T 18, GPIB 17 : Remote ENable 9:non-existing pin // GND // CH552T 18, GPIB 18-23 // signal GND // CH552T 18, GPIB 24 // CH552 Vcc(19)-0.
Read more...

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としておけば,問題無いことが多い.

Read more...

CH552TのRSTピンを入力用に使う

安価なUSBマイコンであるCH552Tは20pinだが、電源とグランドと3.3Vに加えて、USBを使うためには2つのピンを使うので、それ以外の使えるピンは15本となる。 さらに、通常はRSTピンはリセットするために使われるので、実質的に使えるピンは14本である。 しかし、RSTピンによるリセットを無効にすると、入力ピンとして使うことができるようになる。 ネットを探したが、そのやり方に関する情報が見つからなかったので、いろいろと調べながら試行錯誤したら、入力ピンとして使うことができたので、その方法を書いておく。 まず、リセット機能を無効にするために、flashにあるconfiguration dataのEN_RST_RESETを変更しなければならない。 いろいろなツールのソースを見ていたらch55xtoolを使うと、これが実現できそうなことが分かった。 debianでインストールするには、少し工夫が必要だったが、以下のようにすれば動くようになった。 pipx ensurepath python3 -m pipx install ch55xtool sudo aptitude install python3-usb 権限の問題を設定するのが面倒だったので、sudoを使ったら、pathを指定しないといけなくなった。 それなら、ensurepathをしないでも良いのかも知れない。 まず、DFUモードにして、以下のコマンドを実行して、現在の設定を表示する。 sudo ~/.local/bin/ch55xtool -p 購入したばかりのICでは、USBに接続するとDFUモードになるので、そのまま実行でき、以下のような結果が表示される。 Found CH552 with SubId:17 BTVER:02.50 UID:??-??-??-??-??-??-??-?? Chip configs 0xFFFFFFFF 0xFFFFFFFF 0x000052FF Finalize communication. Done. 最後の数字のbit12がEN_RST_RESETで最初は1となっている。 USBを指し直して、すぐに以下を実行すると、リセットを無効にできる。 sudo ~/.local/bin/ch55xtool -p -a Dis_RST_RESET --cfgs_options_force_action もう一度設定を確認すると数字が変わっているのが分かる。 Chip configs 0xFFFFFFFF 0x0000000F 0x000042FF 5から4となり、その二進数の1の桁が0となっており、EN_RST_RESETが0に変わっている。 データシートを見ても説明は無いので、細かいことは分からないが、リセット機能を無効にしても、pull-down抵抗は有効のままのようである。 RSTピンの状態を読み取るには、CLOCK_CFGレジスタのbRSTビットを確認すれば良い。 例えば、ch55xduinoでこれを実現するプログラムは以下の通りである。 uint8_t readRST(){ __data uint8_t bit = bRST; __data uint8_t portBuf = CLOCK_CFG; if (portBuf & bit) return HIGH; return LOW; } digitalReadと同じように書けないのが残念だが、特殊なピンなので仕方がないかな。 でも,adruinoでプログラムを書き換えたら,RSTの設定が元にもどってしまったので,P3.
Read more...

Debian13でrubyからGPIB制御

NIのPCI-GPIBを積んだPCにDebian13を入れて,rubyから制御できるようにセットアップしたので,そのときのやり方を書いておく. Debian13をインストールするところまでは,省略する. sudoもインストールして設定しておく. linux-gpibは,現在はlinux-gpib-4.3.6が最新の安定版のようなので, https://sourceforge.net/projects/linux-gpib/files/linux-gpib%20for%203.x.x%20and%202.6.x%20kernels/4.3.6/ からlinux-gpib-4.3.6.tar.gzを取って来る. そのフォルダに行ってから,以下を実行する. sudo apt install linux-headers-$(uname -r) build-essential automake tar xvfz linux-gpib-4.3.6.tar.gz cd linux-gpib-4.3.6/ tar xvfz linux-gpib-kernel-4.3.6.tar.gz cd linux-gpib-kernel-4.3.6/ make clean sed -i 's/GPIOF_DIR_IN/GPIOD_IN/g' drivers/gpib/gpio/gpib_bitbang.c make sudo make install cd .. tar xzvf linux-gpib-user-4.3.6.tar.gz cd linux-gpib-user-4.3.6 ./configure make sudo make install cd .. sudo ln -s /usr/local/lib/libgpib.so.0 /lib/libgpib.so.0 そして,GPIBボードなどの設定をするために,/usr/local/etc/gpib.confをスーパーユーザーから編集して,最初の方の設定を以下のように変更する. minor = 0 board_type="ni_pci_accel" name="dev0" board_typeはni_pciでも良いようだが,違いは不明である. 最低限のインストールはこれで終了である. 実際にGPIBを使うためには,ドライバーを以下のようにして組み込む. sudo /sbin/modprobe tnt4882 sudo /usr/local/sbin/gpib_config --minor 0 うまく組み込めたかを確認するためには,以下のコマンドを実行する.
Read more...

texの太字が目立たない

debianのtexで文章を書いているのだが,\bfや\textbfにしても,全く目立たないという問題があった. fontの指定の仕方をいろいろと調べたりしてみたが,最終的には以下のようなコマンドを実行したら,うまく表示されるようになった.

sudo kanji-config-updmap-sys auto

texの設定は難しいな.

Read more...

ESPでhttps

マイコンからホームページの情報を読み取る必要が出て来たが,意外に苦労したので,分かったことを書いておこうと思う.近年はほとんどのホームページはhttpsになっており,httpに比べてアクセスするのが複雑になった.wifiを使いたかったので,ESP8266にmicropythonを入れてhttpsを読み取ろうと思ったが,EPS32を使ってなんとか繋ぐことに成功した.基本的な作業はdebian13で行った. まず,EPS8266にmicropythonを入れる作業である.https://micropython.org/download/ESP8266_GENERIC/から現在の最新であるESP8266_GENERIC-20250415-v1.25.0.binを取ってきた.そして,書き込みtoolであるesptoolをaptでinstallする.ESP8266ボードをUSBに接続して, esptool --port /dev/ttyUSB0 erase_flash esptool --port /dev/ttyUSB0 --baud 460800 write_flash --flash_size=detect 0 ESP8266_GENERIC-20250415-v1.25.0.bin のようにして,書き込みをする. 次に,micropythonの動作確認である.シリアルのターミナルを使うのだが,今回はgtktermというのを使ってみた.これをaptで入れてから, gtkterm -p /dev/ttyUSB0 -s 115200 と立ち上げる.設定を変える必要があったら,Configuration-Portから変更できる. そして,ESP8266ボードのRSTボタンを押すと,micropythonのプロンプトがターミナルに表示される. ここまではあっさりと進んだが,その後は試行錯誤が必要だった.このversionのmicropythonにはusslというmoduleが無いことが分かり,v1.20.0やv1.12にはusslがあることを確認したが,いくつかの原因でerrorが出てしまう.ESP32で無いと動かないと判断して,手元にあるEPS-WROOM32を使うことにした. debianでは,ESP32に必要なesptoolのファイルが欠けているようで, wget https://raw.githubusercontent.com/espressif/esptool/refs/heads/master/esptool/targets/stub_flasher/1/esp32.json mv esp32.json stub_flasher_32.json sudo cp stub_flasher_32.json /usr/lib/python3/dist-packages/esptool/targets/stub_flasher/ とする必要があった.また,esptoolで書き込む際には,BOOTボタンを押したまま,ENボタンを押して離し,BOOTボタンを離すことによって,BOOTモードに移行しておく.binをhttps://micropython.org/download/ESP32_GENERIC/から取って来るのだが,最新版はusslが無かったので,今回はv1.20.0を使った.そしてハマったのが書き込みで,アドレスを指定しないといけなくて, esptool --port /dev/ttyUSB0 --baud 460800 write_flash 0x1000 ESP32_GENERIC-20230426-v1.20.0.bin としたら良いということに気づくのにかなり時間がかかってしまった.micropythonのページにはチャンと書いてあるのだが,ESP8266と同じだろうと思って読み飛ばしていた.ENがリセットボタンに対応することにも注意が必要である. やっと準備が終わったのだが,その後もネットの情報を頼りに,usocketを使ったプログラムをいじってみたが,errorが出てうまく行かず,最終的にはurequestsを使ったらアクセスすることに成功した.そのプログラムが以下のものです. import urequests import ussl import network import utime ssid = "wifi_ssid" passkey = "wifi_password" timeout=30 wifi= network.WLAN(network.STA_IF) wifi.active(True) while True: wifi.connect(ssid, passkey) to=timeout while not wifi.
Read more...

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を使うようになると思う.

Read more...

light-locker

安定したシステムを運用したいPCには,私はdebianを使うようにしている.Debian 13 Trixieがそろそろリリースされそうだが,少し前からフライングで使い始めている.軽い環境が好きなので,環境としてはLXDEを主に使っているが,新しくインストールしたPCでは,しばらく放置していると,画面が消えて動かなくなっていることに気がついた.少し調べてみたら,light-lockerという画面ロックツールが,画面をロックしていて,通常はマウスやキーボードを使うと復帰するのだが,それが時々うまく行かなくなっているということが分かった.別のスクリーンセーバーを使えば良いのかも知れないが,面倒だけどpkillすると使えるようになる.uninstallしても良いのかな.

Read more...

attiny261

昔まとめて買ったattiny261を使い切って無くなってしまった. 今は上位互換の861は売っているけど,261は売っているのを見かけないので,今後は861を使うしか無いかな. 昔よりも価格が高くなっているので,261で十分な回路には261を使いんだけど,仕方ありません. 互換性の問題で,そのシリーズを使い続けているが,そろそろ新しい型番の安価なtinyも試してみたいとは思う. 例えば,attiny202とかは,adcや16bitのタイマーもあるので,代替できるはずだけど,プログラムや回路を作り換えるのが面倒だし,202はUPDIという新しい書き込み方式を取っているので,まだ手を出していない.

最近,attiny261を使って回路を作っていたが,ノイズが発生して困っていた. 動作の確認のためにLEDをつけていたのだが,そこに比較的大きな電流が流れていたので,それが原因の可能性があると思って,LEDを動かなくしたら,ノイズが無くなった. 新しく回路を作ると,想定外のところで問題が生じることが多く,その原因を発見するのに苦労する.

以前は,adcが不要なときにはattiny2313を,adcが必要なときにはattiny261/861を,沢山のIOが必要なときにはatmegaまたはarduinoを使っていた. 新しい様々なICが開発されているので,今後はどの目的にどのICを使うかを考えていこうと思う.

Read more...

linuxでVPN

VPN接続をする必要があるときには,openconnectを使っている. debianやubuntuでインストールするには,aptでopenconnectをinstallすれば良い. いろいろなVPNソフトがあるが,それに応じて下の表のようにprotocolを選ばなければならない.

protocol VPN
Cisco's AnyConnect SSL VPN
nc Juniper SSL VPN
pulse Pulse/Ivanti Connect Secure SSL VPN
gp Palo Alto Networks GlobalProtect SSL VPN
f5 F5 Big-IP SSL VPN
fortinet Fortinet Fortigate SSL VPN
array Array Networks AG SSL VPN
そして,以下のように実行して,idとパスワードを入力すれば,VPNに接続できる.
sudo openconnect --protocol=gp -v server
vオプションは何となく付けています.
Read more...