お知らせ

  • らずぱいでIoT

らずぱいでIoT 第13回(C言語で制御するために、その4)

noimage

らずぱいでIoT 第13回(C言語で制御するために、その4)

かわせです。相変わらずラズパイをC言語で使う方法について調べています。 そんな中、前回GPIOにアクセスるために/sys/class/gpioによるアクセス方法をご紹介しましたが、そのドキュメントの中に重大なことが書かれておりました。 /sys/class/gpioでのアクセスは現在推奨されておらず、libgpiodというライブラリを使うように勧めています。 2020年には/sys/class/gpioは廃止されlibgpiodに変更されるようです。 libgpiodでは /dev/gpiochipN にアクセスるライブラリでNは0から始まる数字になるようです。 現在は/dev/gpiochip0しか存在しておらず1や2はありませんがひょっとすると複数のデバイスを想定しているのかもしれません。 ちなみにすでに、libgpiodはGIT HUBで公開されています。 https://github.com/brgl/libgpiod ただいま解析中のためこれ以上詳しいことは書けませんが、現在作成しているプログラムは変更しないと新しいシステムでは動作しなくなる可能性が出てくるため、ラッピング関数で同じインターフェイスから使えるような工夫をしておかないと対応に苦慮するものと思われます。 それから、SPI通信やI2C通信用のデバイスファイルは変更なく使えるようです。 また、解析できたらブログ上でご報告したいと思います。

  • らずぱいでIoT

らずぱいでIoT 第10回(C言語で制御するために、その1)

noimage

らずぱいでIoT 第10回(C言語で制御するために、その1)

こんばんわ川瀬です。 すみません、最近更新をさぼってました。 らずぱいでIoTを書き始めてはや10回を迎えました。 今回から数回はC言語で使って温度、気圧、湿度センサーを使ってみたいと考えています。 その前に! C言語でラズパイを使うにあたっては様々なライブラリが用意されています。 なかでも、ライブラリを使わずにメモリーマップドIOで配置されているレジスタへのアクセスする方法は最もハードウエアを直接制御する方法ということができます。 そのためには、ラズパイで使用されているチップセットの情報が必要となります。 調べ方は以下の通り root@raspberrypi:~# cat /proc/cpuinfo processor : 0 model name : ARMv6-compatible processor rev 7 (v6l) BogoMIPS : 697.95 Features : half thumb fastmult vfp edsp java tls CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x0 CPU part : 0xb76 CPU revision : 7 Hardware : BCM2835 Revision : 9000c1 Serial : 000000003b4523d6 catで/proc/cpuinfoを読んでみると上のような情報が得られチップセットは、BCM2835というタイプであることがわかります。 で、BCM2835をネットで検索してみると https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2835/README.md が先頭に出てきて、内容を読んでみるとBCM2835がModel A、A+、B および Zeroで使われていることがわかります。 更に、このページからチップセットの細かい内容が解説されたPDFを得ることも可能です。 ただし、文章はすべて英語です。

  • らずぱいでIoT

らずぱいでIoT 第8回(16Bit幅の補数計算検証)

noimage

らずぱいでIoT 第8回(16Bit幅の補数計算検証)

pythonのint型変数の扱いには少し注意が必要です。 python3のint型は最大のBit幅に制限なくShortやLongといった区別がなくなりました。 そのため前回の16Bit長のレジスタ値のマイナス表現でpythonが認識しているbit幅に拡張する場合どう描くべきかをC言語のプログラムを使い見てみます。 その前に補数について少し触れておくと 計算機内部では、マイナス値がどのように扱われているかという事を見てみると 1Byte=8bit長の2進数で表現可能で計算機内部では5という数字は 00000101 という2進数です。 この5をある数字から引きたい場合、計算機の中でどのようなことが起きるかというとビットを反転させる解くことが起きていますなので5は 11111010 という2進数になりこれを1の補数といいます。 1の補数表現の5にある数字を足すと例えば十進法の10を足すと十進法の10は2進法で 00001010 なので 11111010+00001010 = 100000100 となりますが8bit幅なので最上位の1が無くなり 00000100 = 十進法の4 となります。 上の2進数の式を10進法で見てみると 250 + 10 = 260 で8bitで表される最大数は255なのであふれた分を計算すると5という10-5の答えが得られます。 では1の補数で計算するとなぜ答えが4になるかというと計算機内部で最上位ビットを符号とした場合 2進数の10000000は-0というおかしな値が存在しているためで、この分符号反転した時点で1を足さないとつじつまが合わないということが起きます。このようにビット反転して1を足した補数を2の補数と呼びます。 2の補数で計算してみると 11111011+00001010 = 100000101 となり2進数でも正しい値が出てきます。 これを踏まえた上で、16Bit幅のマイナス値をpythonのint型に拡張する場合どうするかをpythonではBit幅が確定されていないのでC言語で試してみたいと思います。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー 以下プログラム #include <stdio.h> void main() { unsigned short n = 0xfff5; _______ short m; ____ printf("単純にマイナス %04x->%d(%08x)\n",n,-n,-n); ____ // 16Bit幅で2の補数表現に変換 ____ m=(-n ^ 0xffff)+1; ____ printf("2の補数表現に変換 %08x -> %d\n",m,m); ____ printf("-11のビット確認 %08x -> %d\n",(short)-11,(short)-11); } ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーここまで なお_はスペースを示します。 最初のpirntfではunsigned short(32bit)の変数に0xfff5(16bit)をいれて単純にマイナスに変換すると32Bit幅で2の補数値が計算され0xffff000bとなります。 そのため下位16ビット幅で2の補数を計算してみると 0xfffffff5という値に拡張されていることがわかります。(2番目のprintf) 念のため32Bit長の-11が32bitはばで0xfffffff5であることを確認してみます。(3番目のprintf) ということでpythonで拡張できるかを以下のプログラムで確認してみると ーーーーーーーーーーーーーーーーーーーーーーーーーーーー ここから python #!/usr/bin/python n=0xfff5 print("%x -> %d\n" % (n,(-n ^ 0xffff)+1)) ーーーーーーーーーーーーーーーーーーーーーーーーーーーー ここまで ということで16Bitのマイナス値をPythonの持つ不確定長の整数型に上記の式で拡張できることが検証できます。 今回使用したCのソースとPythonのソースはここからダウンロードできます。