USB-パラレル変換ケーブルの制御

昔のPCにはプリンターポートがあり,プリンターを使う以外にも,データ転送など様々な用途に転用することができた. 私も,WindowsでIOポートを叩いたり,Linuxでparportを使って制御することによって,GPIBをエミュレートして装置を制御したりしたことがある. しかし,最近のPCにはUSBポートぐらいしか無い. USB-パラレル変換ケーブルは,プリンターポートの代わりに使えるので,原理的にはそのケーブルによって,同様に装置の制御ができるはずである. しかし,USB-パラレル変換ケーブルを制御する方法が分からなかった. USBについて多少は詳しくなったので,変換ケーブルの制御の仕方が分かるのでは無いかと思い,いろいろと試してみた. 家にあった変換ケーブルをUSBポートに挿すと,/dev/usb/lp0ができた. lsusb -vで調べてみると,interfaceが一つあって,そのsettingが3つあり,そのうちの2つはprinter classでUnidirectionalとBidirectionalであり,もう1つがvendor specificであることが分かった. USBのprinter classについて調べてみると,最後の1つはプリンターポートの規格であるIEEE 1284に対応していると推定でき,その制御の仕方を理解することが重要であることが分かった. vendor specificの場合には,その制御方法はvendorが決めるのであるが,今回はIEEE 1284という規格を実現するためのものなので,おそらく共通の仕様になっていると予想した. いろいろなICの仕様を調べたら,control transferを使った制御の方法が分かってきた. それを手元にある変換ケーブルに試してみたら,多少の試行錯誤の後,うまく動かすことができた. まず,usblpとしてシステムに使われていると,こちらからの制御は出来ないので,これを開放する. /etc/modprobe.d/blacklist.confにusblpをblacklistに加えて再起動すると,変換ケーブルを制御できる状態になる. あとはlibusbを使ってアクセスすれば良い. 基本的な手順としては,interface0のsetting2にして,auto modeをoffにしてから,双方向通信で制御信号も自由に扱えるBidirectionalモードにしたら,様々な制御が可能になる. 参考までに,rubyで書いたUSB-パラレル変換ケーブルを制御するプログラムは以下の通りである. require "libusb" class UsbLp def initialize() usb = LIBUSB::Context.new device = usb.devices(idVendor: 0x0598, idProduct: 0x1001).first @handle=device.open @handle.claim_interface(0) @handle.set_interface_alt_setting(0,2) @handle.control_transfer(bmRequestType: 0x40, bRequest: 4, wValue: 0x07f8, wIndex: 0x0000) # SET_1284_REGISTER IC control register to auto mode off @handle.control_transfer(bmRequestType: 0x40, bRequest: 4, wValue: 0x0623, wIndex: 0x0000) # SET_1284_REGISTER extended control register to bidirectional status() end # 36pin attr_accessor :strobe # No.
Read more...

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を使うときには,活用して行こうと思う.

Read more...

ch55xduinoを使ってch552で独自のUSB機器

ch552を使って,vendor specificな独自のUSB機器を作ろうと思ったが,情報がなかなか見つからなかった. メーカーのサイトのCH554EVT.zipに含まれている EVT/EXAM/USB/Device/VendorDefinedDev.Cがその公式な例であるが,コメントが中国語だし,汎用性に乏しく,Keil C51という特殊なコンパイラ用のコードで書かれているため,流用が難しい. そこで,いろいろと調べたり試したりした結果,ch55xduinoでch552を使ったvendor specific機器の作り方が分かったので,それを記録に残しておこうと思う. ch55xduinoに含まれているusb関係の定義だけでは,基本的な処理をするコードが足りないので,sdcc用に書かれたコードを利用することにした. ch554_sdcc_usb_blinkyのprojects/includeからusb_desc.hとusb_intr.hを取って来て使う. このとき,usb_intr.hの中の次の一行目の行を,二行目のように変更すると,ch55xduinoで使えるようになる. void DeviceUSBInterrupt(void) __interrupt(INT_NO_USB) void USBInterrupt(void) これは,USBの割り込みがch55xduinoの中ですでに定義されているためである. これらのファイルと同じフォルダにinoファイルを作って,arduinoを使ってプログラムをするのだが,その段階では,いくつか注意するべき点がある. 例としてend point 0とend point 1を使う場合について説明しよう. Arduino.hを読み込む時に,ch5xx_usb.hが読み込まれるので,default値から変更する場合には,その前にEP0_BUFF_SIZEとMAX_PACKET_SIZEの値を定義しておく必要がある. その後,上記のusb_desc.hを読み込んで, 独自のUSBに関する関数の定義をしてからusb_intr.hを読み込む. そして,end point 1のためのバッファーを確保する. 独自の関数としては,end point 1の初期化と,control transferのIN/OUTの処理,end point 1のIN/OUTの処理を書く. setupではUSBの初期化ルーチンを呼び出し,loopでは送受信のデータの処理などを行う. end point 0は主に制御に使われて,USB機器を認識するための情報などがやり取りされるが,一部はvendorも使うことができる. ホストからvendor用のデータを転送する場合には,bRequestTypeを0x41とすると,USB_CUST_CONTROL_DATA_HANDLERで定義された関数が呼ばれる. ホストからのvendor用のデータを要求する場合には,bRequestTypeを0xc1とすると,USB_CUST_CONTROL_TRANSFER_HANDLERで指定された関数が呼ばれて,その返り値のバイト数のデータがホストに送られる. これらの関数中では,UsbIntrSetupReqにはbRequestの値が入っているので,その値によって適切な動作をするように定義する. さらに,UsbSetupBuf->wValueL,wValueHで値を受け取れるので,様々な動作をさせることができる. しかし,やり取りできるデータのサイズは最大でも64バイトであり,小さいデータしか扱うことが出来ない. 大きなデータのやりとりは,end point 0以外を使う. end point 1は,バッファーの大きさが64バイトだが,データを分割することによって,大きなデータを扱うことができる. bulk transferの場合について,この処理を説明する. マイコンへの送信(OUT)の場合には,64バイトのデータを受け取った段階で,NAKにすると,ホストが送信を待ってくれるので,次のデータを受け取れるようになったときに,ACKとすると,次のデータが送られてくる. 送られてきたデータが64バイトのときには,次のデータがあり,それよりも小さい場合には,データの終了であると判断できる. ここで,注意しなければならないのは,データのサイズが64バイトの倍数の場合には,最後のデータとして0バイトのデータを送らないと,データの終わりを判断できないということである. この処理はlibusbが自動でやってくれると思っていたが,最後の0バイトは,自分で送らないといけないということに気付くまでに,試行錯誤をしてしまった. マイコンからの送信(IN)の場合にも,同様の処理を行う. 送りたいデータの64バイトが準備できたら,ACKとすると,ホストが読み取りに来るが,読み取り終わったらNAKにして,次のデータを準備する,という感じで繰り返す. 最後のデータは0から63バイトのデータとして送る. 簡単な動作をさせるプログラムを例として示す. #define EP0_BUFF_SIZE 16 #define MAX_PACKET_SIZE 64 #if (EP0_BUFF_SIZE+2*MAX_PACKET_SIZE) > USER_USB_RAM #error "
Read more...

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...