calendar

     12
3456789
10111213141516
17181920212223
24252627282930
<< September 2017 >>

categories

archives

ロリポップレンタルサーバ

カラーミー

グーペ

お名前.com

ANA ToMeCard

◆ Raspberry Pi 3とRaspberry Pi zeroを購入

0

    仕事がずっと忙しくて、約1年ぶりの投稿である。時間のたつのが速い!

    Raspberry pi3が2016/02/29に発売され、さらに5$のRaspberry Pi zeroが 発売されたのを知り、最新のraspiが急に欲しくなり、KSYで衝動買いをしてしまいました。まず購入したのが、4,860円のRaspberry pi3を購入。5,000円を超えると送料が無料になるので972円の透明のケースと一緒に購入した。

    さらに、Raspberry Pi zeroの販売も開始されていたので、こちらも648円で購入した。送料が756円もして(合計1,404円)、本体の価格より高くてビックリだがここで購入を躊躇すると、入手できなくなると思いこちらも購入した。(実際5/1現在、在庫切れの状態である)

    また、Raspberry pi zeroは接続端子が小型でアダプタ等が無いと標準のUSB機器に接続できないので、Amazonで以下のものを購入した。

    ■アクリルカバー(¥130)

    ■USBマイクロBオスをAメスに変換するケーブル(¥499)

    ■HDMIのミニから標準に変化するアダプタ(¥115)

    ■8GBmicroSDHCカード(¥540)

     

    Raspberry pi zeroはUSBPortが1つしかないので、USB接続のキーボード、マウス、WiFiアダプタは、USBハブを経由して複数機器を接続した。またRaspberry pi zeroは、GPIOの箇所は自分でハンダつけが必要なため、私はピンソケットをここにはんだ付けした。


    ◆ Rasberrypi2 サーボモータを雲台に設置

    0
      サーボモータ(SG90)用の雲台が届いたので、組み立ててみた。しかしながら、ネジが沢山付属しているが、組み立ての説明書が付属してないので、野生の感で組み立ててみた。
      まず。サーボモータに付属しているサーボホーンが大き過ぎで雲台の所定の箇所に入らない。SG90用と銘打ってあるのに...さすが中国製である。しかたないのでニッパで少し大き目のサイズにカットして、あとはキッチリ入るサイズまでヤスリで削ってサイズを整えた。さらにこれが動いてしまうとまずいので、接着剤で貼り付け、裏から付属の極小のネジでホーンを固定した。2番目の写真は、台座になるところだがここも同様に、削って接着剤で張りつけてネジ止めで固定した。

      上下に動作して、カメラを載せる台にサーボモータを設置する為のビスは、下記の写真のような長いビス、ナットしか付属していない。もっと短いビスは付属していたのだがここにサーボモーターを固定するには短すぎて使えない。ほんとうにいい加減なキットなので最初驚いて、最後は呆れてしまった。
      日本のTAMIYA製プラモデル等では、こんなことは決してなく完璧な説明書とサイズがピッタリのビス・ナット等が付属するので如何に日本製がスゴイかを改めて痛感してしまった。

      だから日本製は、価格が高くなるんですよね


      完成したのがこれです。  

      ◆ Raspberrypi2 IC2デバイスを使ってみる

      0
         I2C(Inter-Integrated Circuit)は、フィリップス社が提唱する周辺デバイスとのシリアル通信の方式である。raspiもこのインターフェイスを持っており、たくさんの周辺機器が発売されている。今回は安価な16bitの温度センサー(ADT7410)を接続して使い方を把握しようと思い購入してみた。
        まずは、i2c関連のツールをインストールします。
        sudo apt-get install i2c-tools libi2c-dev ・・・I2Cのインストール
        

        インストールが終わったら、i2c機器の接続アドレスの確認をします。
        i2cdetect -y 1 ・・・接続機器のアドレスを表示
             0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
        00:          -- -- -- -- -- -- -- -- -- -- -- -- --
        10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
        50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
        70: -- -- -- -- -- -- -- --
        

        実際の温度データを読み込んでみる。
        i2cget -y 1 0x48 0x00 w ・・・word単位でデータを読み込む
        0x280c ・・・16進表示
        

        上記の例では0x48に温度センサーがマッピングされているので、i2cgetコマンドで 値を取得して表示した結果が0x280cである。このままではエンディアンが逆転しているので、上位バイトと下位バイトを入れ替えて読む必要がある。またデフォルトでは解像度13ビットで読んでいるので、下位3ビットは捨てて(3bitシフト)、4ビット目から16ビット目を有効な値として扱います。この うち(4bit目)が1ならマイナスの気温をあらわします。ここで4bit目を除いた12bitの値を16で割った値(0.0625を掛けた値)が実際の温度になります。たとえば上記の0x280c場合、まずエンディアン入れ替えで0x0c28となり、これを下位3ビット捨てて(3bitシフト)0x0185、10進数に直して389、0.0625を掛けると、24.3125℃となります。
        右の写真はraspiに秋月電子通商で販売している「ブレッドボード接続キット」を繋いで動作確認をしている様子である。変換基盤にgpio番号等が記述されていてわかり易い。
        これを、pythonのプログラムで記述すると以下のようになります。プログラムはwiringpiの[wiringPiI2CReadReg16]を使用して温度データを読みだしている。

        # -*- coding: utf-8 -*-
        import wiringpi2 as pi
        
        ADRS = 0x48	# I2Cのバスアドレス(デフォルト)
        TREG = 0x00	# 温度レジスタアドレス
        
        def temp_read():
            word = pi.wiringPiI2CReadReg16(fd,TREG)
            print(hex(word))                               #debug
            data = (word & 0xff00)>>8 | (word & 0xff)<<8   #上位・下位バイトを逆転
            print(hex(data))                               #debug
            data = data>>3                         # 13ビットデータ取得(3bitシフト)
            print(hex(data))                               #debug
            if (data & 0xf000) == 0:                      # 温度が正の場合
                temp = data*0.0625
            else:
                 temp = (data - 8192)*0.0625               # 温度が負の場合
            return temp
        
        fd = pi.wiringPiI2CSetup(ADRS)                     # wiringpiのi2cの初期化
        
        try:
            while True:
        	nowtemp = temp_read()
        	print(nowtemp)
        	pi.delay(1000)
        
        except KeyboardInterrupt:
            pass
        
        き[temp_read]内のprint文は内容を確認(デバッグ用)のものです。
        プログラムの記述でWiringpiの関数を使用しているが、smbusで[read_word_data]を使用しても同様である。

        ◆ Raspberrypi2 PWMでサーボモータを動かす

        0
          PWMでLEDの輝度を変化させるプログラムを作ったが、やはりPWMでサーボモータを動かしてカメラのパン(左右)、チルト(上下)の制御をやってみたくなり、とりあえず安価なサーボモータ(SG-90:400円)を購入して動作確認をしてみた。
          実際の物を見ると、写真のように非常に小さなサーボモータであることがわかる。
          このサーボモータの仕様は以下の通りである。
          外形寸法:22.2x11.8x31mm
          重量:9g
          動作電圧:4.8V(〜5V)
          PWM 周期(周波数) : 20ms(50Hz)
          ポジション 周期 Duty比 pwmWriteで設定するDuty比
          1.45ms 7.25% 7.25*1024/100=74.24
          90° ~2.4ms 12% 12*1024/100=122.88
          -90° ~0.5ms 2.5% 2.5*1024/100=25.6

          wiringPiでの[pwmWrite()]のDuty比の設定は0〜1024なのでこの点を踏まえて以下の プログラムでは、事前に値を計算して値を保持している。(上記の表参照)
          以下のpythonのプログラムは、サーボモータの動作確認プログラムである。
          # -*- coding: utf-8 -*-
          import wiringpi2
          
          PWM_PIN = 18   # GPIOの18番ピン
          DUTY_MAX = 123 # 90°の時
          DUTY_MIN = 26  # -90°の時
          DUTY_HOME= 74  # 0°の時
          duty = 0       # Duty比の値(0から1024)
          
          wiringpi2.wiringPiSetupGpio()   #winringPiの初期設定
          wiringpi2.pinMode(PWM_PIN, wiringpi2.GPIO.PWM_OUTPUT)
          #「Balanced」→「mark:space」Modeに変更
          wiringpi2.pwmSetMode(wiringpi2.GPIO.PWM_MODE_MS)
          # 周波数を50Hzにすると、18750/周波数=375
          wiringpi2.pwmSetClock(375)
          
          wiringpi2.pwmWrite(PWM_PIN, DUTY_HOME)        # 0°の位置に移動
          wiringpi2.delay(100) #0.1sec
          
          for duty in range(DUTY_HOME, DUTY_MAX+1, 1):  # 0°から90°まで動かす
              wiringpi2.pwmWrite(PWM_PIN, duty)
              wiringpi2.delay(100) #0.1sec
          wiringpi2.delay(500)    #0.5sec
          for duty in range(DUTY_MAX, DUTY_MIN-1, -1):  # 90°から-90°まで動かす
              wiringpi2.pwmWrite(PWM_PIN, duty)
              wiringpi2.delay(100)
          wiringpi2.delay(500)
          
          wiringpi2.pwmWrite(PWM_PIN, DUTY_HOME)        # 0°の位置に移動
          
          

          ひらめき pwmSetModeの変更は周波数を固定にする設定である。デフォルトのwiringpiでは
           DUTY比を変更すると周波数も変更されてしまう。

          ひらめき pwmSetClockの値の設定についてだが、調べたところ以下の条件式が成立するらしい。
           pwm周波数=raspiのPWMが持つベースクロックの周波数/clock×range
           pwm周波数:50Hz
           raspiのPWMが持つベースクロックの周波数:19.2MHz
           range:1024
           clock:pwmSetClockで設定する値
          従ってclockを求める式は、clock=19.2×10^6/pwm周波数×1024となる。
          clock=18750/pwm周波数

          ひらめきGPIOの18番はハードウェアでのPWMをサポートしているが、他に使用可能なのは
           GPIO12,13,19の3つのポートだけである。試しに他のポートを設定したらサーボは
           全く動作しなかった!(あたりまえ)

          ◆ Raspberrypi2 wiringPiをpythonから使ってみる

          0
            wiringPiをpythonで使えるようにするには、以下のものをINSTALLする必要がある。
            sudo apt-get install python-dev python-setuptools
            git clone https://github.com/Gadgetoid/WiringPi2-Python.git
            cd WiringPi2-Python
            sudo python setup.py install
            

            wiringPiを使用してpythonで、LEDの輝度を変更するプログラムを記述してみた。PWMを使ったことがなかったので、PWMを使用してDuty比を変える事でLEDの輝度を変更するプログラムにしてみた。関数名はCでの記述の名称と同じなので、「wiringpi2.関数名」とすればいいので簡単である。
            き関数の詳細はwiringpiのサイトを参照の事!
            # -*- coding: utf-8 -*-
            import wiringpi2
            
            PWM_PIN = 18   # GPIOの18番ピン
            DUTY = 0       # Duty比の値(0から1024)
            
            wiringpi2.wiringPiSetupGpio()   #winringPiの初期設定
            # PWM出力として18番pinを設定
            wiringpi2.pinMode(PWM_PIN, wiringpi2.GPIO.PWM_OUTPUT)
            #「Balanced」→「mark:space」Modeに変更
            wiringpi2.pwmSetMode(wiringpi2.GPIO.PWM_MODE_MS)
            # Clockを50Hzにする。18750/周波数=375
            wiringpi2.pwmSetClock(375)
            
            try:
                while True:
                    for DUTY in range(0, 1025, 1): #ファードイン
                        wiringpi2.pwmWrite(PWM_PIN, DUTY)
                  wiringpi2.delay(10) #0.01sec
                wiringpi2.delay(500)    #0.5sec
                    for DUTY in range(1024, 1, -1): #フェードアウト
                        wiringpi2.pwmWrite(PWM_PIN, DUTY)
                  wiringpi2.delay(10)
                wiringpi2.delay(500)
            
            except KeyboardInterrupt:
                pass
            wiringpi2.pwmWrite(PWM_PIN, 0)  # LEDを消灯 
            

            ひらめき最終行の命令は、CTRL+Cで実行を中断するとLEDが点灯したままになるのを避けるために挿入してある。また今回GPIO18を使用しているが、Raspi2のPWM出力できるpinは、GPIO18の他にGPIO12,13,19も対応しているとの事である。 その他のピンを使用する場合は、softPwmCreate()、softPwmWrite()を使用すれば可能である。但しサーボモータの制御等の精度が高いPWMが必要な場合はこれは使用できない。上記のLEDの輝度を変更するようなプログラムの場合は、SoftwarePWMで全く問題ない!

            ◆ Raspberrypi2 WiringPiの導入

            0
              WebIOPiの他にもwiringPiというライブラリが存在して、これはC言語のライブラリであるが他の言語用のラッパーも用意されているので、他言語でも利用可能であるらしい。またwiringPiにはコマンドラインから実行出来るgpioユーティリティも付属しているとのことなので簡単にgpioの操作が可能となるらしいのだ! これは面白そうなので早速インストールしてみることにした。まずは、IC2用のライブラリをインストールしてから、wiringPiのソースをダウンロードしてコンパイルする。
              注)wiringPiはコマンド操作時にPだけ大文字なので間違えないように!
              $sudo apt-get install libi2c-dev ・・・・・・I2Cのライブラリをインスト−ル
              $git clone git://git.drogon.net/wiringPi・・・gitを使ってソースを取得
              $cd wiringPi
              $./build ・・・・ ソースのコンパイル
              
              $gpio -v ・・・・ バージョンの確認
              gpio version: 2.29
              Copyright (c) 2012-2015 Gordon Henderson
                :
              

              インストールが終了したら、早速gpioユーティリティを試してみよう。GPIO24にLEDを接続して以下の コマンドを実行すれば、LEDの点灯を確認できる。
              $gpio export 24 out  ・・・ GPIOポート24番を出力として使用開始
              $gpio -g mode 24 out ・・・ 上記と同様
              $gpio -g write 24 1 ・・・ GPIOポート24番の値を1にする ==> LED点灯 
              $gpio -g write 24 0 ・・・ GPIOポート24番の値を0にする ==> LED消灯  
              $gpio unexport 24  ・・・・ GPIOポート24番の使用を終了する
              
              gpioユーティリティの[-g]はGPIOのポート番号で指定の意味である。export/unexportは[-g]が不要で 統一性で欠けると思うのだが...

              wiringPiはC言語のライブラリなので、以前Pythonで書いたのLED点滅プログラムをwiringPiを使ってC言語で書くと下記のようになる。
              #include <wiringPi.h>
              #LED 24                              /* GPIO24 */
              
              int main (void) {
              	wiringPiSetupGpio();
              	pinMode(LED, OUTPUT);
              	while (1) {
              		digitalwrite(LED, HIGH);
              		delay(500);      /* 500msec */
              		digitalwrite(LED, LOW) ;
              		delay(500);
              	}
              }
              

              ひらめきバージョン管理ツール(git:ギット)がインストールされていない場合は、以下のようにinstallを行う。
              $sudo apt-get install git-core ・・・・gitのインストール
              

              きwiringPiの詳細はWiringPi.comを参照してください。

              ◆ Raspberrypi2 WebからのLEDコントロール

              0
                respi2にwebiopiもインストールできたので、まずは手始めにLEDの点灯を制御するHTMLを作成してwebiopiの使い方に慣れようと思う。

                ■Python側の記述は以下のように行う。
                import webiopi
                GPIO = webiopi.GPIO

                変数の定義
                ...
                def setup():
                webiopiが起動時に呼ばれる関数を記述する
                ...
                def loop():
                webiopiが起動している間に常時呼ばれる関数を記述する
                ...
                def destroy():
                webiopiが終了時に呼ばれる関数を記述する
                ...
                @webiopi.macro
                Webブラウザ(javascript)からの要求時の処理をマクロ関数として記述する。
                ...

                ■実際のPythonでのLEDの点滅プログラム
                import webiopi
                GPIO = webiopi.GPIO
                
                LED = 24
                LED_SW = 0
                
                def setup():
                    GPIO.setFunction(LED, GPIO.OUT)
                
                def loop():
                    if LED_SW == True:
                	    GPIO.digitalWrite(LED, True)
                    webiopi.sleep(0.5)
                    GPIO.digitalWrite(LED, False)
                    webiopi.sleep(0.5)
                
                def destroy():
                    GPIO.digitalWrite(LED, False)
                
                @webiopi.macro
                def switchLED(sw):
                    global LED_SW
                    LED_SW = int(sw)
                
                ひらめきSwitchLED()の引数が1のときは点灯、0のときは消灯となり、引数をGLOBAL変数にセットしloop():でこの値を判断してLEDを点灯している。

                ■HTMLファイル

                ◆ Raspberrypi2 RPi.GPIOとWebIOPi

                0
                  raspi2の標準OSであるRasbianに、デフォルトでインストール済みのpythonライブラリがRPi.GPIOである。(RPiはRaspberryPiの略)
                   pythonのプログラムでは、このライブラリを使用することで、容易にGPIOを制御するプログラムを作成することが可能となる。またこれとは別のWebIOPiは、RaspberryPi用のIOT( Internet of Things )のフレームワークという位置づけに当たり、こちらを使うとGPIOの制御をブラウザから実現可能となる。詳細はwebiopi.trouch.comを参照してください。RPi.GPIOはpythonのプログラムだけを作って実行すればいいのに反して、WebIOPiは、webからアクセスするのでhtml、JavaScript、cssといったものも作る必要があり、さらにpythonのプログラムの作り方も異なるので、若干ハードルが高い。そこで二つの違いを理解するために、今回はまずwebからのアクセスは行わず、同じ機能のプログラムを2つのライブラリ(フレームワーク)を使用して記述してみた。
                   
                  RPi.GPIOを使用したLED点滅プログラム
                  import RPi.GPIO as GPIO
                  import time
                  
                  LED = 24 
                  
                  GPIO.setmode(GPIO.BCM)
                  GPIO.setup(LED, GPIO.OUT)
                  
                  while True:
                      GPIO.output(LED, True)
                      time.sleep(0.5)
                      GPIO.output(LED, False)
                      time.sleep(0.5)
                  
                  programの実行はコマンド画面から直接実行する。
                  $sudo python ファイル名
                  

                  WebIOPiを使用したLED点滅プログラム
                  import webiopi
                  GPIO = webiopi.GPIO
                  
                  LED = 24
                  
                  GPIO.setFunction(LED, GPIO.OUT)
                  
                  while True:
                      GPIO.digitalWrite(LED, True)
                      webiopi.sleep(0.5)
                      GPIO.digitalWrite(LED, False)
                      webiopi.sleep(0.5)
                  
                  programの実行はサービスの起動で行う。
                  $sudo /etc/init.d/webiopi start
                  

                  ひらめきwebiopiの起動では、以下の箇所を事前に更新しておく必要がある。今回のプログラムはwebを介さないので、下記の[HTTP]の記述は不要である。
                  ▲/etc/webiopi/config
                  [SCRIPTS]
                  myproject = /home/pi/webiopi/python/script.py   .pyファイルの場所を指定
                  ...
                  [HTTP]
                  doc-root = /home/pi/webiopi/              .htmlのフォルダを指定
                  ...
                  welcome-file = index.html			  htmlファイル名を指定
                  ...
                  

                  ◆ Raspberrypi2 WebIOpiの設定

                  0
                    web上からGPIOの操作が可能となるWebIOpiをインストールして、動作確認を行なった。まずはネットからダウンロードする。事前にブラウザで確認すると2015/9/10時点の最新版は0.7.1なのでこれをwgetでダウンロードして、/home/piの下に解凍する。
                    wget http://webiopi.googlecode.com/files/WebIOPi-0.7.1.tar.gz
                    tar xvzf WebIOPi-0.7.1.tar.gz
                    

                    解凍したフォルダ(webiopi-0.7.1)内のsetup.shを実行すればinstallができるのだが、このままだと、2015/9/10現在webiopiがraspi2に完全対応していないため、動作しないので暫定として下記の修正してからsetup.shを実行する必要がある。しかしながらこの事に気が付かず、自分の設定が悪いと考えて相当悩んでしまった... 早くnetで調査すべきでした。
                    修正箇所は以下の2つのC言語のソースファイルを修正する。
                     /home/pi/WebIOPi-0.7.1/python/native/cpuinfo.c内の下記の行を修正する。
                      修正前:if (strcmp(hardware,"BCM2708")==0
                      修正後:if (strcmp(hardware,"BCM2709")==0

                     /home/pi/WebIOPi-0.7.1/python/native/gpio.c内の下記の行を修正する。
                      修正前:#define BCM2708_PERI_BASE 0x20000000
                      修正後:#define BCM2708_PERI_BASE 0x3f000000

                    上記の修正が終わったら、インストールをすれば完成です。
                    $./setup.sh
                    

                    WebiIOpiの起動、停止、状態確認は以下のコマンドで確認できる。
                    $sudo /etc/init.d webiopi start    webiopiの起動
                    $sudo /etc/init.d webiopi end      webiopiの停止
                    $sudo /etc/init.d webiopi status   webiopiの状態確認
                    

                    webiopiの起動が確認できたら、ブラウザから下記のURLを入力する。ログイン認証後にWebIOPiのメインメニュからGPIO Headerを選択して右のような画面が表示されればOKである。
                    URL: http://192.168.0.200:8000/
                    LoginID : webiopi
                    Password : raspberry
                    注)URLのIPアドレスは、自分のraspi2のIPアドレスである。

                    ◆ RaspBerryPi2 接続環境を整える

                    0
                      raspi2への無線LAN環境が設定できたので、まずはraspi2本体にマウス、キーボード、モニタを接続することなく利用できる環境を整えることにした。

                      SSHのサービス起動
                      $sudo /etc/init.d/ ssh start     SSH起動
                      $sudo update-rc.d/ ssh defaults  SSHの自動起動設定
                      
                      この設定でPCからは、定番ソフトの「teraterm」,「winscp」からアクセスが可能になります。セキュリティ強化でSSH接続のPORT番号を変更したい場合は、下記のconfigファイル内のport 22を変更すればよい。
                      /etc/ssh/sshd_config

                      VNCのインストール
                      $sudo apt-get install tightvncserver            VNCのinstall
                      $tightvncserver :1 -geometry 1280x1024 depth 24 画面設定 
                      $sudo /etc/init.d/tightvnc start                サーバ起動
                      $sudo update-rc.d/ tightvnc defaults            VNC自動起動設定
                      
                      上記の設定で、PC側には「UltraVNC」をインストールすればGUI環境でraspi2を使用可能である。

                      Nginx(Webサーバ)のインストール
                      $sudo apt-get install nginx         Nginxのinstall
                      $sudo /etc/init.d/nginx start       サーバ起動
                      /usr/share/nginx/www/index.html     ホームDirectory
                      
                      WebSeverと言えば有名なのはApacheだが、raspi2にはメモリ使用量が少なく軽量の「Nginx」をinstallした。Nginxは2014年6月時点でApache、IISに次ぐ第3位のシェアらしい。Nginxの優位性等の詳細は@ITの記事が参考になると思う。
                      外部にWebコンテンツを公開しなくても、Webserverをinstallすることで、raspi2のGPIOを「WebIOpi」を使用して制御できるようになるので、インストールは必須と思われる。

                      追記)webIOPiは自身でwebServer機能を保持しているのでインストールは必須」というのは間違いです。ごめんなさい!

                      パッケージ管理方法
                      私はRedhat系のLinuxしか使った事がなく、Debian系のapt-getコマンドには全く馴染みがない。そこで良く使いそうなコマンドを簡単にまとめておいた。
                      (APTはAdvanced Package Toolの略)
                      $sudo apt-get update              ライブラリのインデックスを更新
                      $sudo apt-get install "package"   パッケージのインストール
                      $sudo apt-get remove "package"    パッケージの削除
                      $sudo apt-get upgrade "package"   パッケージを最新バージョンにする
                      $apt-cache search "keyword"       キーワードを含むパッケージ一覧を表示
                      $apt-cache show "packege"         パッケージの詳細情報の情報を表示
                      

                      | 1/2PAGES | >>