google「raspberry pi リアルタイムカーネル」 https://qiita.com/mt08/items/136c29bba5e0a3e4972c ... PREEMPT_RTについて
google「raspberry pi リアルタイムカーネル rtlinux」 https://nw-electric.way-nifty.com/blog/2018/02/raspberrypirt-l.html ... RT-Linuxについて。 RT-Linux の開発は少なくとも 2018年までは続いていたようだ。今月のバージョンもあり。
上記URLのページを参考に作業:
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/ より、 https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.17/patch-5.17.1-rt17.patch.gz をダウンロード。 これは、ラズベリーパイかどうかとは無関係であることに注意。
対応するカーネルソースを https://github.com/raspberrypi/linux よりダウンロード
5.17はバージョンが新しすぎてラズパイ用のlinuxソースが無さそう。 ウェブページに掲載されている4.9.76でやってみる。
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patch-4.9.76-rt61.patch.gz をダウンロード。
しかし、ソースがダウンロードできず: kobayasi@akamono%[1025]wget https://github.com/raspberrypi/linux/archive/aae807a781807e95c761fe0a5babbc9bd5adaed6.tar
2018の情報だから、ディレクトリ構成が変わっていても無理はない。
参考: https://sozorablog.com/raspberrypi_initial_setting/
ノートPCで作業。
https://www.raspberrypi.com/software/ より、Raspberry PI Imager (Windows用のimager_1.7.4) をダウンロード、ファイルをダブルクリックしてすぐインストールできた。
SDカードを挿してから、
「OSを選ぶ」で、Raspberry Pi OS(64-bit)を選択、 「ストレージを選ぶ」で新品の32GB SDカード(F:としてマウント済)を選択、 「書き込み」
ラズパイに挿して、起動。 指示に従い、ユーザ:kobayasi で初期設定した。
GUI画面で起動後、ラズパイにて: $ sudo apt-get install tenet telnetd 問題なくインストールされた。ノートPC からラズパイに telnet 接続できるようになった。
$ sudo apt-get install ftpd この後、ftp で caio530F.tgz をラズパイに転送できた。
しかし、caio530F.tgz を展開、make したらエラーとなるので、対処: kobayasi@raspberrypi:~ $ sudo apt-get install linux-headers
その後、make が通った。
sudo make install もOK。
1. /boot/config.txt に dtparam=i2c_vc=on を追記 2. 再起動
3. と 4.
$ cd caio530F/contec/caio/config kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo ./config ---------------------------------- CONTEC API-AIO(LNX) Configuration ---------------------------------- メッセージ:デバイスを検出中です。 ................................................................................... . -------------------------------------------------------------------------------- デバイス一覧 -------------------------------------------------------------------------------- DeviceName Product Name ID IP/Master IP Status [1]:+ AIO000 CPI-AI-1208LI 0 -------------------------------------------------------------------------------- [#]:デバイス選択 [o]:リスト並べ替え [r]:デバイスリスト再検出 [d]:デバイス削除 [a]:デバイス手動追加 [e]:診断レポート [s]:設定の保存 [q]:終了 設定を行うデバイスを選択してください。 コマンド入力:s ******************************************************************************** 設定を保存しますか?(y/n):y メッセージ:設定ファイルは'contec_aio.conf'です。 メッセージ:起動スクリプトファイルは'contec_aio_start.sh'です。 メッセージ:停止スクリプトファイルは'contec_aio_stop.sh'です。 確認(y):
5.
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo ./contec_aio_start.sh
以上で初期設定は完了だそうだが、 しかし、
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ i2cdetect -y 1 Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory
再起動しても症状変わらず。 再起動する前に lsmod で表示されていた caio が出てこない。
contec_aio_start.sh に実行属性が無く、ちゃんと動かなかったようだ。
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo chmod 755 contec_aio_start.sh
今度は
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ ls /usr/local/etc/contec_aio.conf /usr/local/etc/contec_aio.conf
がちゃんと出来た。
しかし、
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ i2cdetect -y 1 Error: Could not open file `/dev/i2c-1' or `/dev/i2c/1': No such file or directory
症状変わらず。 マニュアルに、本体のダイヤルか何かでアドレスを設定する話があったが、それをやっていないのが原因か。 ダイヤルではなかったが、I2Cを有効にしていなかった。 マニュアルの指示通りに、 ラズパイで、設定→Raspberry Piの設定→インターフェイスで I2C を on にしてOKを選択。 今度は、
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
できた。
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
問題なし。
アナログ入出力ドライバ API-AIO(LNX) の使い方、サンプルプログラムなどはオンラインマニュアルにある。 https://www.contec.com/jp/api/downloadlogger?download=https://help.contec.com/pc-helper/api-tool-lnx/jp/APITOOL.htm#t=mergedProjects%2FCAIO%2Fwelcome%2Findex.htm
A/Dボードの取説 lxab03_220531.pdf
kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/Ai $ pwd /home/kobayasi/caio530F/contec/caio/samples/jp/gcc/console/Ai kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/Ai $ make gcc -Wall -c -o ai.o ai.c gcc ai.o -o ai -lcaio kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/Ai $ ./ai デバイス名を入力してください : AIO000 アナログ入力レンジを以下の範囲から選択してください ±10V : 0 0〜10V : 50 ±5V : 1 0〜5V : 51 ±2.5V : 2 0〜4.095V : 52 ±1.25V : 3 0〜2.5V : 53 ±1V : 4 0〜1.25V : 54 ±0.625V : 5 0〜1V : 55 ±0.5V : 6 0〜0.5V : 56 ±0.3125V : 7 0〜0.25V : 57 ±0.25V : 8 0〜0.1V : 58 ±0.125V : 9 0〜0.05V : 59 ±0.1V : 10 0〜0.025V : 60 ±0.05V : 11 0〜0.0125V : 61 ±0.025V : 12 0〜0.01V : 62 ±0.0125V : 13 0〜20mA : 100 ±0.01V : 14 4〜20mA : 101 +/-20mA : 102 1〜5V : 150 14
AioSetAiRangeAll = 21041 : The value of AiRange is outside the designated range of the device being used
英語版の python 用のサンプルプログラムの ai.c を見たら、print(f" ..... とか書いてあってsyntax error になった。 python の printf が最近関数化されたせいかも。
一度リブートしたら、また lsmod で caio が出てこなくなった。 /usr/local/etc/contec_aio.conf はある。この中に /dev/caio000 と記載されているが、このデバイスファイルも無い。 ブート時に contec_aio.conf を見ていない? 仕方ないので手動で、ついでに config もやっておく:
$ sudo ./config
sで保存 qで終了
kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo chmod 755 contec_aio_start.sh kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo ./contec_aio_start.sh kobayasi@raspberrypi:~/caio530F/contec/caio/config $ lsmod | grep caio caio 503808 0 kobayasi@raspberrypi:~/caio530F/contec/caio/config $ ls -l /dev/caio* ls: '/dev/caio*' にアクセスできません: そのようなファイルやディレクトリはありません kobayasi@raspberrypi:~/caio530F/contec/caio/config $ cat /proc/contec_aio.conf #start { DeviceName:String:AIO000 Device:String:CPI-AI-1208LI FileNode:String:/dev/caio000 Minor:Number:0 DeviceType:Number:30 VendorID:Number:0x0 DeviceID:Number:0x8703 BoardID:Number:0 SerialID:String: WaitTimeWhenOutput:Number:0 IPAddress:String: Net_UnitID:Number:0 Net_DeviceID:Number:0 Net_ProductID:Number:0 Net_Type:Number:0 Port:Number:0x0 } #end
/dev/caio000 が無くていいのか?
サンプルプログラムの動作も、最初通過していた初期化が通らなくなってしまった:
kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/Ai $ ./ai AioInit = 1 : Failed in the acquisition of the resource kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/Ai $ i2cdetect -y 0 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: 50 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- -- kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/Ai $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
「28」も出なくなった。??
I2Cを一旦無効→有効にしたが症状変わらず。 ADボードの設定が初期化されることを期待して、一旦 shutdown → 電源off → 電源onしてブート。
kobayasi@raspberrypi:~ $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- 28 -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
表示された。
kobayasi@raspberrypi:~ $ lsmod | grep caio kobayasi@raspberrypi:~ $ ls /dev/caio* ls: '/dev/caio*' にアクセスできません: そのようなファイルやディレクトリはありません kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo ./config kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo chmod 755 contec_aio_start.sh contec_aio_stop.sh kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo ./contec_aio_start.sh kobayasi@raspberrypi:~/caio530F/contec/caio/config $ lsmod | grep caio caio 503808 0 kobayasi@raspberrypi:~/caio530F/contec/caio/config $ ls /dev/caio* ls: '/dev/caio*' にアクセスできません: そのようなファイルやディレクトリはありません
./ai の動作は元に戻った(電源offにしたのが効いたかも):
kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/Ai $ ./ai アナログ入力レンジを以下の範囲から選択してください ±10V : 0 0〜10V : 50 ±5V : 1 0〜5V : 51 ±2.5V : 2 0〜4.095V : 52 ±1.25V : 3 0〜2.5V : 53 ±1V : 4 0〜1.25V : 54 ±0.625V : 5 0〜1V : 55 ±0.5V : 6 0〜0.5V : 56 ±0.3125V : 7 0〜0.25V : 57 ±0.25V : 8 0〜0.1V : 58 ±0.125V : 9 0〜0.05V : 59 ±0.1V : 10 0〜0.025V : 60 ±0.05V : 11 0〜0.0125V : 61 ±0.025V : 12 0〜0.01V : 62 ±0.0125V : 13 0〜20mA : 100 ±0.01V : 14 4〜20mA : 101 +/-20mA : 102 1〜5V : 150 50
AioSetAiChannels = 10002 : AIO driver can't be called
/dev/caio* が FIFO なのでは。これが無いのは、ラズパイOSが新しすぎるからかも?
FIFOを使わない SingleAi を試してみる。
kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/SingleAi $ ./singleai デバイス名を入力してください : AIO000 アナログ入力レンジを以下の範囲から選択してください ±10V : 0 0〜10V : 50 ±5V : 1 0〜5V : 51 ±2.5V : 2 0〜4.095V : 52 ±1.25V : 3 0〜2.5V : 53 ±1V : 4 0〜1.25V : 54 ±0.625V : 5 0〜1V : 55 ±0.5V : 6 0〜0.5V : 56 ±0.3125V : 7 0〜0.25V : 57 ±0.25V : 8 0〜0.1V : 58 ±0.125V : 9 0〜0.05V : 59 ±0.1V : 10 0〜0.025V : 60 ±0.05V : 11 0〜0.0125V : 61 ±0.025V : 12 0〜0.01V : 62 ±0.0125V : 13 0〜20mA : 100 ±0.01V : 14 4〜20mA : 101 +/-20mA : 102 1〜5V : 150 50 アナログ入力を行うチャネルを入力してください 0〜7 : 0 チャネル 電圧 0 0.002441V
できた。
・おそらく、/dev/caio* は FIFO。 ・single の AD変換 を繰り返せばいい。 ・API-TOOL(LNX)のマニュアルは、PCIバスのボードとか、他のと共用。
一旦電源off後、GND と AD0 に直流安定化電源をつないでから:
kobayasi@raspberrypi:~ $ cd caio530F/contec/caio/config/ kobayasi@raspberrypi:~/caio530F/contec/caio/config $ sudo ./contec_aio_start.sh kobayasi@raspberrypi:~/caio530F/contec/caio/config $ lsmod | grep caio caio 503808 0 kobayasi@raspberrypi:~/caio530F/contec/caio/config $ cd ../samples/jp/gcc/console/SingleAi/ kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/SingleAi $ ls Makefile caio.h singleai singleai.c singleai.c.org singleai.c~ singleai.o kobayasi@raspberrypi:~/caio530F/contec/caio/samples/jp/gcc/console/SingleAi $ ./singleai アナログ入力レンジを以下の範囲から選択してください ±10V : 0 0〜10V : 50 ±5V : 1 0〜5V : 51 ±2.5V : 2 0〜4.095V : 52 ±1.25V : 3 0〜2.5V : 53 ±1V : 4 0〜1.25V : 54 ±0.625V : 5 0〜1V : 55 ±0.5V : 6 0〜0.5V : 56 ±0.3125V : 7 0〜0.25V : 57 ±0.25V : 8 0〜0.1V : 58 ±0.125V : 9 0〜0.05V : 59 ±0.1V : 10 0〜0.025V : 60 ±0.05V : 11 0〜0.0125V : 61 ±0.025V : 12 0〜0.01V : 62 ±0.0125V : 13 0〜20mA : 100 ±0.01V : 14 4〜20mA : 101 +/-20mA : 102 1〜5V : 150 アナログ入力を行うチャネルを入力してください 0〜7 : min=0.002441, max=0.024414
直流安定化電源に同期して電圧表示が変化した。A/D変換自体はOKだ。
あとは、ラズパイos上でリアルタイム処理をどう動かすか。 そこで、A/D変換用の関数が動くかどうか(動かないのでは。。。) OSとしてはI2Cデバイスとして見えているので、I2Cがリアルタイムで動けばいいはずだが、 I2Cデバイスのドライバを書けるか?