UIAPduinoでシリアルモニタ

Arduinoでは出来るのに,UIAPduinoで出来無いことの一つが,シリアルモニタである. UIAPduinoでは,USBからの書き込みは出来るが,bootloaderに書き込まれたソフトでUSBを取り扱っているので,Arduino IDEで作ったユーザーのプログラムの実行時には,USBは使えない. そのために,UIAPduino単体ではシリアルの出力をモニタできないのである. 例えば,ADCなどの結果を出力させたりする際には,PC側からその結果を見たいが,そのような時に,シリアルモニタが便利である. UIAPduinoで,マイコンの出力をPCから見る方法は,いくつか考えられる. 最も簡単に思い付くのが,別のUSB-シリアル変換を使う方法である. CH32の書き込み機であるWCH-LinkEにもこの機能があり,それらを使うと,Arduino IDEからモニタすることができる. しかし,そのハードを別途用意する必要があり,コストもかかるので,ここではUIAPduinoのみという縛りをつけて,それを実現する方法を考えてみよう. ch32funでよく行われているのが,デバッグプリントを使う方法で,SWDIOを使ってデータを送って,PCから見ることが出来る. この方法は,一般にはWCH-LinkEをマイコンに接続して行うが,そのかわりにUAIPduinoで書き込み機を作って,同様に使うことが可能である. ch32v003でUSBを使うためのrv003usbには,rvsdio_programmerという書き込み機を作るためのソフトがあり,UIAPduinoにこれを書き込むと,それを使ってデバッグプリントできるようになる. ユーザーのプログラムの実行用とモニタ用で,二つのUIAPduinoが必要になるが. 標準のrvsdio_programmerから,ピン番号とDPUの設定をカスタマイズしたUIAPduino用のバイナリをdownloadする. wget https://www.uiap.jp/doc/rvswdio_programmer-md5sum-651b141f51da9a29e9988559fc562157.bin すでに設定してある場合には不要だが,UIAPduinoに書き込みをする権限を設定する. sudo wget -O /etc/udev/rules.d/99-minichlink-uiap.rules https://raw.githubusercontent.com/YuukiUmeta-UIAP/ch32fun/3bfa603f11d493710f2a811b5a2dfad905d9425c/minichlink/99-minichlink-uiap.rules sudo udevadm control --reload-rules sudo udevadm trigger 書き込み用のソフトであるminichlinkは, wget https://github.com/YuukiUmeta-UIAP/ch32v003fun/releases/download/1.0.0/minichlink-2982dfd-1.0.0.tar.gz tar -zxvf minichlink-2982dfd-1.0.0.tar.gz mv minichlink-2982dfd/minichlink . とすると,minichlinkができる. UIAPduinoのRSTボタンを押しながらUSBにつないで,minichlinkを使って,以下のコマンドで書き込みを行う. ./minichlink -c 0x1209b803 -w rvswdio_programmer-md5sum-651b141f51da9a29e9988559fc562157.bin flash -b そして,rvsdio_programmerにアクセスする権限を以下のようにして与える. sudo wget -O /etc/udev/rules.d/99-minichlink.rules https://github.com/cnlohr/ch32fun/raw/refs/heads/master/minichlink/99-minichlink.rules sudo udevadm control --reload-rules sudo udevadm trigger これで,UIAPduinoをrvsdio_programmerとして使うことができるようになった. あとは, ボードをデバッガにするのところに書いてある通りに配線して, ./minichlink -T とすれば良いはずである. しかし,この手法にはいくつかの欠点がある. まず,Arduino IDEからは使えないことである.現時点では,私はArduinoからSWDIOへの出力の仕方は分らない.一般的なArduinoにはSWDIOは無いので,可能だとしても特殊な使い方が必要になるはずである. また,配線が少し複雑である. シリアルモニタの場合には,GNDと電源とデータの三本で良いのだが, rvsdio_programmerの仕様上,特定のピンを繋いだりする必要がある. Arduino IDEのからシリアルモニタから見ることが出来無いのも,面倒かも知れない.
Read more...

UIAPduinoをch32funで使う方法

UIAPduinoの開発環境として,初心者にとって最も簡単なのはおそらくArduino IDEである. 新しい種類のマイコンを使うたびに,そのマイコンの仕様を勉強するのは大変だが, arduinoは,マイコンの種類をあまり意識せずに使えるという点で,優れていると思う. UIAPduinoのArduino環境は,WCH社のArduino環境を用いており,少い重いという欠点がある. また,USBを使ったプログラムを作ることができない.

もう一つのUIAPduinoの開発環境が,ch32funであり,軽くて機能も充実しているが, ch32funでプログラムを組むには,CH32V003について多少の知識が必要となる. 実は,UIAPduinoのUSBによる書き込みは,ch32funのrv003usbを使ってソフト的に実現している. 同様に,ch32funでrv003usbを使うと,USBを利用するようなプログラムも作ることができる. ちなみに,PlatformIOでは,ch32funを使うことができるらしいが,私は使ったことが無い.

ch32funでUIAPduinoを使うには, UIAPduinoのbootloaderは,ch32funのbootloaderとProductIDが異なるので,minichlinkでの書き込み時のコマンドにオプションを指定する必要がある. そこで,ch32fun/ch32fun.mkの中の

FLASH_COMMAND?=$(MINICHLINK)/minichlink -w $< $(WRITE_SECTION) -b

という行を,

FLASH_COMMAND?=$(MINICHLINK)/minichlink -c 0x1209b803 -w $< $(WRITE_SECTION) -b

に変更する. すると,普通のch32funと同様にUIAPduinoを使うことができる. minichlinkをUIAPduinoのものと入れ替えても良いのだが.

ch32funでUIAPduinoを使うもう一つの方法を紹介しておこう. AlexanderManderaさんの環境は,arduino IDEからch32funを使えるようにしたものなので,これを使うと,Arduino IDEからch32funを通して,UIAPduinoを使うことができる. Arduino IDEでファイル-環境設定として,追加のボードマネージャのURLに

https://alexandermandera.github.io/arduino-wch32v003/package_ch32v003_index.json

を入れて, ツール-ボード-ボードマネージャで"ch32"などと検索すると,“WCH Boards"が出てくるので,インストールするとこの環境が使えるようになる. そして,UIAPduinoを使えるように,以下のようにして書き込みソフトをUIAPduinoのもので上書きする.

cp ~/.arduino15/packages/UIAP/tools/minichlink-2982dfd/1.0.0/minichlink ~/.arduino15/packages/alexandermandera/tools/minichlink/1.0.0/

この環境を UIAPduinoの環境と比較をしてみよう. ファイル-スケッチ例-01.Basics-Blinkの例に,

#define LED_BUILTIN 2

を加えてUIAPduinoでコンパイルすると,6972バイトとなる. スケッチ-コンパイルしたバイナリを出力としてできるbinファイルのサイズは7140バイトである. ツール-ボード-WCH Boards-CH32V003として,環境を変えた場合のbinファイルは1640バイトである. ファイルサイズは四分の一となり,プログラムがかなりコンパクトになってることが分かる. ch32funがベースになっているので,うまく設定すればrv003usbも使えるかも知れない. このように,UIAPduinoの環境よりも,こちらの方が良いようにも思えるが,必ずしもそうとは言えない. この環境では,digital IOとSerialはarduinoと同じように使えて,i2cは少し違う形式で使うことができるが,analog IOなどはまだ使えない. また, ch32funも古いものを使っており, しばらく更新が止っているので,進展はあまり望めないように思われる. digital IOとSerialしか使わなくて良い場合を除いて,UIAPduinoの環境を使っておくのが良いのでは無いだろうか. なお上の例で,ピン番号の代わりにPC0などを使う場合には,C0としなければならないことに注意しないといけない.

Read more...

UIAPduinoを試してみた

安価でそれなりの性能のマイコンとして,WCH社のCH32V003を時々使うようになった. 最初はICを基板に半田付けして使っていたが,特に3.3Vで使いたい時には,三端子レギュレータなども使わなければならないので,面倒に感じていた. CH32V003を使ったマイコンボードとしては,WeAct Studioの開発ボードを見付けたので,少し使ってみたが,USBを使うためにはチップ抵抗を三つ半田付けしなければならないことが判った. そのままでUSBを使うことができるCH32V003のマイコンボードとしてUIAPduinoというものがあり,興味はあったが入手経路が限られていたので見送っていたが,なんと開発者の方から連絡があって,譲ってもらえることになった. 昨日届いたのだが,同じ日にUIAPduinoについての記事が出ていたので読んでみたが,興味深いものだった. 積極的に普及活動を行っているようで,大いに感謝したい. 早速,少し使ってみたので,Debian13でのArduino IDEからUIAPduinoを使う方法を説明したい. まずはArduino IDEをaptでインストールする. sudo apt install arduino arduinoを立ち上げると,UIAPduinoには関係しないが,dialoutのgroupに追加するかを聞かれるので,addを指定する. ここでインストールされるarduinoのversionは1.8.19であり, UIAPduinoの公式ページによると,このversionは動作確認されていないそうだが,aptで簡単に使えるversionで使えた方が良いので,以下ではこのversionについて説明する. UIAPduinoを使えるようにするために,ファイル-環境設定として,追加のボードマネージャのURLに https://github.com/YuukiUmeta-UIAP/board_manager_files/raw/main/package_uiap.jp_index.json を入れて, ツール-ボード-ボードマネージャで"uiap"などと検索すると,UIAPduinoが出てくるので,インストールする. そして,USBでの書き込み権限を与えるために,以下のコマンドを実行する. sudo wget -O /etc/udev/rules.d/99-minichlink-uiap.rules https://raw.githubusercontent.com/YuukiUmeta-UIAP/ch32fun/3bfa603f11d493710f2a811b5a2dfad905d9425c/minichlink/99-minichlink-uiap.rules sudo udevadm control --reload-rules sudo udevadm trigger インストール作業は基本的にはこれで終了であるが,このversionでは書き込み時にエラーが出るので,少し後に説明するような修正が必要である. それでは,実際の使い方である. 新しいUIAPduinoをUSBに接続すると,二つのLEDが点灯し,一つのLEDが点滅する. 明るさがゆるやかに変化するので,PWMでも使っているのかな. arduino IDEではボードの種類を,ツール-ボード-CH32V EVT Boards Support-Pro Micro CH32V003と選択する. 別のボードをインストールしている場合には,“CH32V EVT Boards Support"が複数出てくることもあるが,その下に"Pro Micro CH32V003"だけがあるものを選択する. 一番簡単な例として, ファイル-スケッチ例-01.Basics-Blinkを選んで,LEDをon/offするプログラムを呼び出す. setup()よりも前に, #define LED_BUILTIN 2 という行を追加する. ボードのピン番号の2の代りに,ICのピンの名前のPC0でも良い. しかし,いざ書き込みをしようとすると,コンパイルが終った後に, 書き込み中にエラーが発生しました:設定パラメータの「upload.params.quiet」が見つかりません というエラーが出てしまう. これを回避するためには,設定ファイル ~/.arduino15/packages/UIAP/hardware/ch32v/1.0.42/boards.txt の適当な場所に, CH32V00x_EVT.upload.params.quiet= CH32V00x_EVT.upload.params.verbose= という行を追加して,arduinoを立ち上げ直せば良い. すると,書き込み時には
Read more...

picoRuby

ESP32を使うときには,私は主にmicropythonを使っていた. C言語よりはpythonの方が楽なので. micropythonでは,binaryを書き込んだら,pythonのコードをマイコンが実行してくれる.

esp32ではmrubyというrubyを使うことも出来るが,rubyのコードをPC側でコンパイルしてマイコンに書き込む必要がある. 手順も複雑なので,素人向では無いと感じて,手を出さなかった. mrubyも進化しているようで,mruby/cという小さなRAMで動かせるものも開発されているが,大まかな使い方はmrubyと同じようである.

mruby/cについて調べていたら,picoRubyというものもあることを知った. microの次はnanoなのに,それを飛ばしてpicoになったのは何故かなと思ったら,raspberry pi pico用に開発されたものだからのようだ. 使い方はmrubyと似ているのかなと予想したが,micropythonと同じように使うことができる. それなら使ってみようかなということで,試してみることにした.

raspberry pi picoが必要だが,手元にあるRP2040-zeroを使うことにした. まず,binaryをここから最新のものをdownloadして,展開する. pico用とpico2用があるが,今回は前者に対応しているのでそれを選ぶ. daily buildなどは無いようなので,最新のコードのbinaryが必要な場合は,自分でbuildしないといけない. BOOTを押しながらUSBに接続すると,RPI-RP2というmediaがマウントされるので,そこにuf2ファイルをコピーする. インストールはこれで終了である.

しばらく待ってからRESETを押すと,/dev/ttyACM0が出来ているので,ターミナルソフトで接続する. linuxだと,例えば以下のコマンドである.

gtkterm -p /dev/ttyACM0 -s 115200

lsなどの簡単なコマンドや,rubyを使うためのirbが使える. まずは簡単な計算をやってみて,micropythonと同じ感覚で使えることを感じた. Lチカをしようと思ったけど,RP2040のLEDは簡単では無いようなので,電圧のON/OFFをやってみた.

pin = GPIO.new(1, GPIO::OUT)
10.times{pin.write(1);sleep 1;pin.write(0);sleep 1}

esp32用のpicorubyもあるけど,binaryが無かったので,今回は見送った. binaryも公開して貰えると,素人でも始めやすくなって,使う人が増えると思うので,公開してくれると助かるけどな. しかし,esp32用のpicorubyは,netには対応していないようである. esp32のwifiが使えるようになったら,micropythonの代わりにpicorubyを使って行きたい. 開発が進むのを待つことにしよう.

Read more...

WeActStudioのCH32V003開発ボード

WCH社のCH32V003というマイコンを時々使うようになった. 当初は,ArduinoにWCHサポートをインストールして使っていたが,ソフトで実装したUSBを使うことができるch32funを使うようになった. 特にUSB用のbootloaderを書き込むと,以降はWCHLinkを使わずにUSBから書き込みが出来て便利である. しかし,マイコンそのものを使ってUSBを使えるようにするには,USBを繋げるようにしたり,3.3Vを作ったり,33Ωと1.5kΩの抵抗を接続したりしないといけないので,それなりの手間がかかる. そこで,CH32V003を使ったマイコン開発ボードを試してみることにした. いくつかの開発ボードが作られているようだが,小型で手に入りやすいという理由から,WeActStudioのものを使ってみることにした.

WeActStudioからは様々なボードが発表されており,それらはAliexpressから入手できる. 今回はCH32V003F4U6 Mini Core Boardを選んで, USBは通常は電源の供給のみであるが,回路図を確認すると,少し改造するとUSB通信が出来るように設計されていることが解る. 基板のUSBと書いてあるところの近くに三つの空きのランドがあるが,USBという文字に近い方の二つには33Ω,残りの一つに1.5kΩのチップ抵抗を半田付する. そして,ch32funのrv003usbでは,以下のように設定する.

#define USB_PORT D
#define USB_PIN_DP 3
#define USB_PIN_DM 4
#define USB_PIN_DPU 5

WCHLinkをつなぐための端子もあるので,それを使ってプログラムすることができ, rv003usbのbootloaderを使う場合にも,最初はそれを使って書き込む. 空きのランドの形が,半田で繋いで短絡しやすいようになっていたので,最初は短絡して試したがうまくいかず,回路を追い掛けたら抵抗が内蔵されていないので,それを半田付する必要があることに気が付いた.

PD5がUSBのDPUに使われてしまうために,USBを利用するときには,使えるピンの数は3つ減ってしまう. DMを3.3Vに直結すれば,PD5を開放できるのだが,それはこのボードでは簡単には実現出来無い. また,PD7がNRSTとして使われているために,スイッチとコンデンサに接続されており,これらを切り離してPD7を独立した入力ピンとして使えないのも残念なところである. そのため,実質的に使えるピンの数は,14である.

WeActStudioのCH32V003開発ボードでUSBを使うためには,二種類のチップ抵抗を用意して,それらの三つを半田付するというのが,少し面倒だが,ICから準備するよりはかなり楽になる. CH32V003を使ってUSBが扱えるマイコンボードであるUIAPduinoは,安価な上に半田付なども無しでUSBからプログラムを書き込めるようなので,このマイコンでUSBを使おうとしている人は,このボードの方が良いかも知れない. 入手経路が限られているために,これまで使ったことは無いのですが.

Read more...

arduino nanoのVin

ステッピングモーターをマイコンで動かそうとして,どのマイコンを使うか迷ったが,小型のarduino nanoを使うことにした. モーターのドライバーには,GNDと信号と電源を供給する必要があるが,ピンの順番の関係で,RSTの配線をカッターで切断して,そこに電源をつなぐことにした. Vinという端子があったので,それがUSBから電源として入力された信号を出す端子だろうと思って,それを電源として使ったら,モーターのトルクが非常に小さくなってしまった. 電圧を測ると,2Vぐらいしか出ていない. 調べてみると,Vinという端子は,そこに外部電源をつなぐための端子であることが分かった. つまり,arduino unoでは,ACアダプターをつなぐ端子があるが,その代わりに使う端子のようだ. 結局,5VがUSBの電源に対応するようなので,それを使ったら無事に動いた.

こういった単純な作業に使うマイコンボードとしては,小型で安いnanoが楽かなと思う. 小型のマイコンボードとしては,arduino pro microやesp8266ボードやesp32ボードに加えて,ch552ボードなどを使って来た. UIAPduinoなんかも安くて良さそうだけど.

Read more...

localhostと127.0.1.1

127.0.0.1は自分自身を表すIPだが,debianでマシン名に対応するIPは127.0.1.1となっている. つまり,自分自身には,127.0.0.1と127.0.1.1と割り当てられているIPが対応している. サーバーを立てているPCから,そのサーバーにアクセスしたときには,上記のどのIPを使うかによって,サーバーから見た接続先が異なっている.

例えば,rubyでserve側で

require "socket"
s=TCPServer.new(3030)
p s.accept.peeraddr

としてから,client側で

require "socket"
s=TCPSocket.open('localhost',3030)

とすると,serve側には

["AF_INET", 37666, "127.0.0.1", "127.0.0.1"]

などと表示される. 一方,localhostの代わりに,割り当てられたIPを指定すると,割り当てられたIPが表示される.

今回苦しんだのが,127.0.1.1にアクセスした場合の振る舞いである. 私の2009/1/16のブログを見るとその時のrubyでは,127.0.1.1と表示されたようである. しかし,最近のrubyでは,127.0.0.1と表示されるように変わったようである. 昔書いたプログラムを新しいPCで動かそうとして,なかなか思ったように動かなかったが,これが原因だったようである.

Read more...

Python-FuでGimpのFilter

Gimpで画像を処理させるときに,以前はScript-Fuを使っていてscheme言語で書くのが難しかったが,最近はPython-Fuを使えるようになって,楽になった. ちなみに私がpythonを使うのは,micropythonかPython-Fuが主な気がする. 少しは慣れて来たのだが,Filterなどの高度な処理をPython-Fuから行う方法が分からなかった. Gimp3.0になったし,新たに調べてみたら,やり方が分かったので,書いておきたい.

まず,画像の一部を選択した状態にする. Filters - Development - Python-Fu - Python Consoleからコンソールを開いて,以下のコマンドを実行すると,medianフィルターが適用される.

img=Gimp.get_images()[0]
lyr=Gimp.Image.get_layers(img)
chl=Gimp.Selection.save(img) #unselect layer
Gimp.Image.set_selected_layers(img,lyr)
drw=Gimp.Image.get_selected_drawables(img)[0]
flt = Gimp.DrawableFilter.new(drw, "gegl:median-blur", "")
fc = flt.get_config()
fc.set_property("radius", 10)
drw.append_filter(flt)

filterやそのpropertyの名前は,GEGLのサイトで調べることができる. get_configで作ったものに対してset_propertyをするという少し回りくどい設定をしてから,適用する. append_filterでは元の画像を保持したままfilterが非破壊に適用されますが,元の画像を保持する必要が無いときにはmerge_filterを使って下さい.

Read more...

Arduino上でTinyUSBを使ったCH32VのUSBデバイス

TinyUSBがCH32に対応した事を知ったので,それを使ってUSBデバイスを作ってみた. TinyUSBを使ってみた感想だが,USB serialなどの頻繁に使われるデバイスを作るのは簡単だが,癖が強くてファイルの構造が複雑なので,独自のデバイスの開発は難しいように感じた. 今回は,CH32シリーズの中で,USB機能が内蔵されている安いものとして,CH32V203K8T6を使ったが,そのときに分かったことを,簡単に説明する. ArduinoにWCHの公式サポートを入れた後に,スケッチ-ライブラリをインクルード-ライブラリを管理から,TinyUSBを検索してインストールする. 他のライブラリもセットでインストールするかを聞かれるが,すべてインストールして良い. それらのファイルは,~/Arduino/libraries/Adafruit_TinyUSB_Library/に保存されるので,必要に応じて参照することができる. 簡単な例はファイルのスケッチ例から見ることができるので,プログラムの参考になるだろう. 基本的な使い方としては,はじめに#include <Adafruit_TinyUSB.h>としてライブラリを組み込んでから,setup()でTinyUSBDevice.begin(0);を,loop()ではTinyUSBDevice.task();を実行する. 作りたいデバイスの種類に応じて,以下のようにオプションを指定することが出来,その後でライブラリをincludeするようにする. #define CFG_TUD_CDC 1 #define CFG_TUD_MSC 0 #define CFG_TUD_HID 0 #define CFG_TUD_MIDI 0 #define CFG_TUD_VENDOR 1 #define CFG_TUD_VIDEO 0 注意しなければならないのは,必ずUSB Serialが組み込まれてしまうという点である. いじっていて,何をやってもttyACM0として認識されるので,困っていたが,そういう仕様らしい. これを除くには,beginした後で,TinyUSBDevice.clearConfiguration()を実行すれば良い. その後で,自分が作りたいデバイスの定義をして行く. このとき,CDCを0にすると,うまく認識されなくなる. おそらくこれもUSB Serialが一旦組み込まれるからかも知れない. 以下ではvendor specificの場合について説明する. TinyUSBDevice.addInterfaceでAdafruit_USBD_Interfaceのサブクラスを指定すると,そのgetInterfaceDescriptorメソッドが呼び出されるので,その中でdescriptorを作るようにする. descriptorはTinyUSBDevice.allocInterfaceとTinyUSBDevice.allocEndpointとTUD_VENDOR_DESCRIPTORを使って簡単に作ることができる. control transferについては,device/usbd.cで記述されているtud_vendor_control_xfer_cbに処理を書いておくと,それが実行される. request->bRequestなどの値で分岐を行い,tud_control_xferでデータを返すことができる. end pointを介したデータのやりとりは,class/vendor/vendor_device.cに記述されている. データの読み書きは,tud_vendor_n_readやtud_vendor_n_writeを使って,指定したバッファに対して入出力する. この際,tud_vendor_n_availableやtud_vendor_n_write_flushなども併用すると良い. TinyUSBDevice.task()が呼ばれたときに,様々な処理が行われるが,その中で, マイコンがデータを受信したときにtud_vendor_rx_cbが, 送信し終えたときにはtud_vendor_tx_cbが呼び出される. これらの関数にデータの送受信の後に行う処理を記述することによって,デバイスの動作を制御することができる. これまでに書いたUSBデバイスのプログラムでは,PC側からの通信で割り込みがかかったときに,どのような処理をするかを書くことによって,データの送受信を行っていた. end pointの大きさは64バイトなので,データは64バイト毎に区切られるが,割り込みを使うことによって,送受信の要求があったときに次のデータの準備をするようにすると,バッファの大きさを気にせずにデータのやり取りをすることが出来た. しかし,TinyUSBでは割り込みの処理の部分はユーザーからは使わないような設計思想のようである. TinyUSBの現在の仕様では,送信用には1023バイトのバッファが用意されているようだが,バッファに64バイト以上のデータが溜まるか,flushされたときにのみ,実際にUSBへの転送が行われる. 64バイト未満のデータしか無い場合には,flashしないと,読み取ろうとしてもtimeoutしてしまうので,注意が必要である. また,64バイトより大きなデータの場合には,タイミングによっては64バイト溜まったときに一旦データが送られて,データの終了として0バイトのデータも送られることもあり,そこでデータが切れてしまうので,そこにも注意が必要である. 最小限の変更でデータが64byteで分割されないようにするために,tud_vendor_tx_cbがデータの終了の有無を返すようにして,終了のときにだけ必要に応じて0バイトのデータを送るようにしたら,64byteより大きなデータも途切れずに送信できるようになった. 具体的な変更するのは,vendor_device.hとvendor_device.cの中のtud_vendor_tx_cbの型をvoidからboolにして,defaultではtrueを返すようにして,vendor_device.cの中のtud_vendor_tx_cbを呼び出しているところで,その値を以下のように変数に入れて, // tud_vendor_tx_cb(itf, (uint16_t) xferred_bytes); bool fin=tud_vendor_tx_cb(itf, (uint16_t) xferred_bytes); その変数が真のときにのみ,終端信号を送るように,
Read more...

ruby/tkのインストール

rubyで扱うことのできるGUIには,現在は様々な選択肢がある. rubyの初期の頃には,GUIとしてはruby/tkが主流であり,私も以前はそれを使ってGUIを作っていた. しかし,十年ぐらい前にruby/tkが標準ライブラリから外れて,次に何を使おうか迷っていたが,その時はgtk2を使ってみた. 最近,久々にGUIを作ろうとしたら,debianにはruby/gtk2が無くなって,ruby/gtk3になっていたので,それも少し使ってみた.

今回,ずいぶん昔に書いたruby/tkのプログラムを,debian13で動かすことになったのだが,それをruby/gtk3に移植するのが大変そうだったので調べてみたら,ruby/tkは標準ライブラリでは無くなったものの,gemでインストールできることが分かった. 少しテクニカルだが,以下のようにすればインストールできる.

sudo apt-get install tcl8.6-dev tk8.6-dev 
sudo gem install tk -- --with-tcltkversion=8.6 \
 --with-tcl-lib=/usr/lib/x86_64-linux-gnu \
 --with-tk-lib=/usr/lib/x86_64-linux-gnu \
 --with-tcl-include=/usr/include/tcl8.6 \
 --with-tk-include=/usr/include/tcl8.6 \
 --enable-pthread

そして,昔のプログラムを走らせてみたら,rubyのversionによる違いのために,多少の書き換えが必要だったが,ruby/tkの部分は無事に走った. まだ,バグは残っているかも知れないが,ほとんど書き換える必要が無くなった.

GUIのプログラムはほとんど書かないので,久々に書こうとすると,使い方を思い出したりするのに時間がかかる. また,次々に新しいGUIの選択肢が出てきて,古いツールから新しいツールに移行すべきかを迷うこともある. ruby/tkがまだまだ使えることが分かったので,しばらくはそれを使い続ければ良いかなという気がして来た. ruby/tkを初めて使ったときには,その使い方を理解するのに時間がかかったが,それを覚えるのは無理だと感じて,自分がruby/tkを使いやすくするためのツールを書いて,それを介してtkを使うようにしたら,それなりに楽に使えるようになった. 簡単なGUIを作ろうとしているので,その手法でruby/tkで書いてみようと思う.

Read more...