お知らせ

  • らずぱいで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 第9回(python版 気温・気圧・湿度計算)

noimage

らずぱいでIoT 第9回(python版 気温・気圧・湿度計算)

今回は、いよいよpython版のレジスタの読取り・計算・表示の全プログラムです。 このプログラムでは、Dict(連想配列)を使う事でチップ説明書にあるレジスタアドレスと一致するように工夫してあります。 プログラムの内容自体は、前回のチップ説明書の中にある保障式を今まで書いてきたプログラムに合うように書き直したものです。 ------------------------------------- 以下ソース #!/usr/bin/python import smbus import time SMBUS_NUMBER = 1 SMBUS_ADDR = 0x77 SMBUS_REG_CONF = 0xF5 SMBUS_REG_CTRL_MEAS = 0xF4 SMBUS_REG_CTRL_HUM = 0xF2 dig_T = {} dig_P = {} dig_H = {} calib = {} n = 0x88 while n <= 0xA1: __ calib[n] = 0 __ n = n + 1 n = 0xE1 while n <= 0xF0: __ calib[n] = 0 __ n = n + 1 n = 0xF7 while n <= 0xFE: __ calib[n] = 0 __ n = n + 1 bus = smbus.SMBus(SMBUS_NUMBER) bus.write_byte_data(SMBUS_ADDR,SMBUS_REG_CONF,0xA0) bus.write_byte_data(SMBUS_ADDR,SMBUS_REG_CTRL_HUM,0x01) bus.write_byte_data(SMBUS_ADDR,SMBUS_REG_CTRL_MEAS,0x25) time.sleep(0.1) for k in calib.keys(): __ calib[k] = bus.read_byte_data(SMBUS_ADDR, k) dig_T[1] = (calib[0x89] << 8 | calib[0x88]) dig_T[2] = (calib[0x8B] << 8 | calib[0x8A]) dig_T[3] = (calib[0x8D] << 8 | calib[0x8C]) dig_P[1] = (calib[0x8F] << 8 | calib[0x8E]) dig_P[2] = (calib[0x91] << 8 | calib[0x90]) dig_P[3] = (calib[0x93] << 8 | calib[0x92]) dig_P[4] = (calib[0x95] << 8 | calib[0x94]) dig_P[5] = (calib[0x97] << 8 | calib[0x96]) dig_P[6] = (calib[0x99] << 8 | calib[0x98]) dig_P[7] = (calib[0x9B] << 8 | calib[0x9A]) dig_P[8] = (calib[0x9D] << 8 | calib[0x9C]) dig_P[9] = (calib[0x9F] << 8 | calib[0x9E]) dig_H[1] = calib[0xA1] dig_H[2] = (calib[0xE2] << 8 | calib[0xE1]) dig_H[3] = (calib[0xE3]) dig_H[4] = (calib[0xE4] << 4 | calib[0xE5] & 0xf) dig_H[5] = (calib[0xE6] << 4 | calib[0xE5] >> 4) dig_H[6] = (calib[0xE7]) for i in [2,3]: __ if (dig_T[i] & 0x8000): ____ dig_T[i] = (-dig_T[i] ^ 0xffff)+1 for i in [2,3,4,5,6,7,8,9]: __ if (dig_P[i] & 0x8000): ____ dig_P[i] = (-dig_P[i] ^ 0xffff)+1 for i in [2,4,5]: __ if (dig_H[i] & 0x8000): ____ dig_H[i] = (-dig_H[i] ^ 0xffff)+1 if (dig_H[6] & 0x80): __ dig_H[6] = (-dig_H[6] ^ 0xff)+1 raw_T = calib[0xFA] << 12 | calib[0xFB] << 4 | calib[0xFC] >> 4 raw_P = calib[0xF7] << 12 | calib[0xF8] << 4 | calib[0xF9] >> 4 raw_H = calib[0xFD] << 8 | calib[0xFE] tv1 = ((raw_T >> 3) - (dig_T[1] << 1)) * (dig_T[2] >> 11) tv2 = (((raw_T >> 4) - dig_T[1]) * ((raw_T >> 4) - dig_T[1])) >> 12 tv2 = (tv2 * dig_T[3]) >> 14 t_fine = tv1 + tv2 Temp = ((t_fine * 5 + 128) >> 8) / 100.0 pv1 = (t_fine / 2.0) - 64000 pv2 = ((pv1 / 4.0) * (pv1 / 4.0) / 2048) * dig_P[6] pv2 = pv2 + ((pv1 * dig_P[5]) * 2.0) pv2 = (pv2 / 4.0) + (dig_P[4] * 65536.0) pv1 = (((dig_P[3] * (((pv1 /4.0) * (pv1 * 4.0)) /8192)) / 8) + ((dig_P[2] * pv1) / 2.0)) / 262144 pv1 = ((32768 + pv1) * dig_P[1]) / 32768 if pv1 != 0: __ p = ((1048576 - raw_P) - (pv2 / 4096)) * 3125 __ if p < 0x80000000: ____ p = (p * 2.0) / pv1 __ else: ____ p = (p / pv1) * 2 __ pv1 = (dig_P[9] * (((p / 8.0) * (p / 8.0)) / 8192.0)) / 4096 __ pv2 = ((p / 4.0) * dig_P[8]) / 8192.0 __ p = p + ((pv1+ pv2 + dig_P[7]) /16.0) else: __ p = 0 Pres = p / 100.0 hv = t_fine - 76800.0 if hv != 0: __ hv = (raw_H - (dig_H[4] * 64.0 + dig_H[5]/16384.0 * hv)) * (dig_H[2] / 65536.0 * (1.0 + dig_H[6] / 67108864.0 * hv * (1.0 + dig_H[3] / 67108864.0 * hv))) __ hv = hv * (1.0 - dig_H[1] * hv / 524288.0) __ if hv > 100.0: ____ hv = 100.0 __ elif hv < 0.0: ____ hv = 0.0 else: __ hv=0.0 Hum = hv print "T=%2.1f P=%4.1f H=%1.2f" % (Temp,Pres,Hum) ------------------------------------- ここまで 尚、_はスペースです。 ソースはこちらからダウンロードできます。  

  • らずぱいでIoT

らずぱいでIoT 第3回(配線と接続確認)

noimage

らずぱいでIoT 第3回(配線と接続確認)

今回は、いよいよRaspberryPIとセンサーの結線と動作確認を行います。 ここからは、AE-BME280というセンサーモジュールのデータシートを見ながら作業を行います。 以下のURLでデータシート(秋月電子様のサイト)は入手できます。 http://akizukidenshi.com/download/ds/akizuki/AE-BME280_manu_v1.1.pdf 実際の結線をデータシートの内容と照らし合わせながら解説しますと ます左側にある「I2Cの接続方法」でI2Cで動作させるためにはJ3というジャンパをはんだ付けしてモジュールがI2C通信を行うように設定します。 右側の図は実際の結線で上側がセンサーもジュール、下側がRaspberryPIのGPIO端子で注意すべき点はセンサー側の5番ピンを3V電源(GPIO1番ピン)につなぐかGND(GPIO9番ピン)でセンサーのアドレスが変ります。 ※補足 GPIOピンには電源として+5Vと+3Vが供給されていますAE-BME280の場合1.71V~3.6V動作と書かれていますので+3Vの1番ピンを使います。 ここではデフォルトでは0x76で面白くないので+電源につないで0x77に変えてみます。 ※補足 GPIOピンの見方ですがRaspberryPI本体の基盤パターを見るとGPIOピンの1番ピンが〇ではなく□になっていることで判断できます。 実際につないでみた写真が以下です。 でこの結線があっているかを確認してRaspberryPIを起動します。 rootユーザーになり前回インストールしたi2c-toolsのコマンドで配線道理のアドレスにセンサーがあることを確認してみます。コマンドはi2cdetectというコマンドを実行委ます。オプションの -y 1 の1はI2Cデバイスの番号1を指定して、-yは対話モードを禁止しています。 0x77にセンサーもジュールが配置されていることが確認できました。  

  • らずぱいでIoT

らずぱいでIoT 初投稿(Raspbian起動編)

noimage

らずぱいでIoT 初投稿(Raspbian起動編)

かわせです。 RaspberryPIとIchigoJamを使って温度・湿度・気圧センサーを接続してプログラムを作っていく過程を投稿しようと思います。 RasberryPIではOSがRaspbian(Debian)Linuxを使ってシェル・python・C言語を使いIchogoJamではBasicでプログラミングしてみたいと考えています。 マイコンとセンサーはSPIとI2Cと呼ばれるシリアル通信で接続されるものが多いようで中でもI2C通信について触れていきたいと思います。 で!初回の今回はRasberryPIを使える状態にするのが先決なのでセットアップと電源の入り切りについてPDFにまとめてみたのでダウンロードしてみてください RasberryPI準備編 尚この投稿で使うハードウエアはIchigojamとRaspberryPI Zero WHを使います。 あとLinuxの使い方の話もツラツラと書いていきます。