Raspberry Pi 備忘録 / Mbedもあるよ!

Raspberry Pi であれこれやった事の記録

ステッピングモーターその1 モーターとドライバ(L6470)を試す

ステッピングモーターを試します。

モーター、ドライバー、ネジをセットで変えるストロベリーリナックスから購入しました。

42mm ステッピングモータ 12V 2相 - ネット販売

L6470 ステッピングモータ・ドライバキット - L6470 - ネット販売

L6470/42x34mmステッピングモーター用ネジセット - ネット販売

別に、ネジを使用する予定はないのですが、買ってみました。

ドキュメントがしっかりしているのが決め手でした。

https://strawberry-linux.com/pub/l6470-manual.pdf

モーター

f:id:pongsuke:20160921120929j:plain

そもそも、ステッピングモーターの、1相、2相など、コントロールの種類に関しては、事前に勉強が必要。

仕様 
 ・2相バイポーラ ステッピングモータ 
 ・推奨動作電圧:DC12V 
 ・ステップ数:200ステップ(1.8度) 
 ・電流:0.33A/相 
 ・シャフト径:5mm 
 ・シャフト長さ:24mm(方軸) 
 ・コイル抵抗:34Ω 
 ・重量:200g 
 ・保持トルク:0.23N・m 
 ・絶縁抵抗:100MΩ以上(500VDC) 
 ・サイズ:42(W)x42(H)x34(D)mm 

モータードライバ

仕様
コントローラ STMicroelectronics L6470
対応モータ バイポーラ(2相)ステッピングモータ
モータ電源 DC8V~45V
ロジック電源 DC3.3V~5V
最大モータ電流 3A rms (ピーク7A)
インターフェース SPI(4線式)
マイクロステップ数 1/1~1/128の間で設定ができます。
自己消費電流 約5mA(3.3V 動作時)
約1mA(5V動作時) ※実測値
その他機能 3.0Vレギュレータ内蔵,パワーダウンモード,オシレータスリープモード
サイズ 約40x40mm
※このドライバは基本的にモータ電源とロジック電源の2系統の電源を必要とします。
※製作・使用にあたり巻末の使用上の注意をよく読んでお使いください。

SPI の準備

raspi-config から、SPI を有効にします。
9 Advanced option > A5 API から、設定します。

$ lsmod | grep spi
spi_bcm2835             7286  0
$ ls /dev/spidev*
/dev/spidev0.0  /dev/spidev0.1

配線

f:id:pongsuke:20160921131258j:plain

GPIO 9(SPI MISO)  3(SDO)
GPIO11(SPI SCLK)  5(SCK)
GPIO10(SPI MOSI)  6(DSI)
GPIO 8(SPI CE0)   7(~CS)

なお、CN1インターフェースに、RPIの3.3vとGNDだけをつなぐと、配線した際にOSが落ちました。
モーター電源に電源をつないだ状態で抜き差ししても、落ちません。

配線してある状態でモーターへの給電を止めても、落ちません。

なんとなくですが、ジャンパー設定が「3.3vを給電可能」モードと共通なので、
モーター電源が来ていない場合、その辺がゴニョゴニョしているのかなーと思います。

 wiringPi を準備する

インストール

$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi/
$ ./build

コーディング

慣れない C です。

こちらを元に、書き換えました。
起動、加速、減速、解放・・・のつもりです。

http://junkroom2cyberrobotics.blogspot.jp/2012/09/raspberry-pi-spi.html

#include <stdio.h>
#include <stdlib.h>

#include <wiringPi.h>
#include <wiringPiSPI.h>

#define L6470_SPI_CHANNEL 0

// 関数プロトタイプ。
void L6470_write(unsigned char data);
void L6470_init(void);
void L6470_run(long speed);
void L6470_softstop();
void L6470_softhiz();

int main(int argc, char **argv)
{
        int i;
        long speed = 0;

        printf("***** start spi test program *****\n");

        // SPI channel 0 を 1MHz で開始。
        if (wiringPiSPISetup(L6470_SPI_CHANNEL, 1000000) < 0)
        {
                printf("SPI Setup failed:\n");
        }

        // L6470の初期化。
        L6470_init();

        while(1)
        {
                for (i = 0; i < 10; i++)
                {
                        speed += 2000; // 30000 位まで
                        L6470_run(speed);
                        printf("*** Speed %d ***\n", speed);
                        delay (1000);
                }


                for (i= 0; i < 10; i++)
                {
                        speed -= 2000;
                        L6470_run(speed);
                        printf("*** Speed %d ***\n", speed);
                        delay (1000);
                }

                L6470_softstop();
                L6470_softhiz();
                return 0;
        }

        return 0;
}


void L6470_write(unsigned char data)
{
        wiringPiSPIDataRW(L6470_SPI_CHANNEL, &data, 1);
}

void L6470_init()
{
        // MAX_SPEED設定。
        /// レジスタアドレス。
        L6470_write(0x07);
        // 最大回転スピード値(10bit) 初期値は 0x41
        L6470_write(0x00);
        L6470_write(0x41);

        // KVAL_HOLD設定。
        /// レジスタアドレス。
        L6470_write(0x09);
        // モータ停止中の電圧設定(8bit)
        L6470_write(0xFF);

        // KVAL_RUN設定。
        /// レジスタアドレス。
        L6470_write(0x0A);
        // モータ定速回転中の電圧設定(8bit)
        L6470_write(0xFF);

        // KVAL_ACC設定。
        /// レジスタアドレス。
        L6470_write(0x0B);
        // モータ加速中の電圧設定(8bit)
        L6470_write(0xFF);

        // KVAL_DEC設定。
        /// レジスタアドレス。
        L6470_write(0x0C);
        // モータ減速中の電圧設定(8bit) 初期値は 0x8A
        L6470_write(0x40);

        // OCD_TH設定。
        /// レジスタアドレス。
        L6470_write(0x13);
        // オーバーカレントスレッショルド設定(4bit)
        L6470_write(0x0F);

        // STALL_TH設定。
        /// レジスタアドレス。
        L6470_write(0x14);
        // ストール電流スレッショルド設定(4bit)
        L6470_write(0x7F);
}

void L6470_run(long speed)
{
        unsigned short dir;
        unsigned long spd;
        unsigned char spd_h;
        unsigned char spd_m;
        unsigned char spd_l;

        // 方向検出。
        if (speed < 0)
        {
                dir = 0x50;
                spd = -1 * speed;
        }
        else
        {
                dir = 0x51;
                spd = speed;
        }

        // 送信バイトデータ生成。
        spd_h = (unsigned char)((0x0F0000 & spd) >> 16);
        spd_m = (unsigned char)((0x00FF00 & spd) >> 8);
        spd_l = (unsigned char)(0x00FF & spd);

        // コマンド(レジスタアドレス)送信。
        L6470_write(dir);
        // データ送信。
        L6470_write(spd_h);
        L6470_write(spd_m);
        L6470_write(spd_l);
}

void L6470_softstop()
{
        unsigned short dir;
        printf("***** SoftStop. *****\n");
        dir = 0xB0;
        // コマンド(レジスタアドレス)送信。
        L6470_write(dir);
        delay(1000);
}

void L6470_softhiz()
{
        unsigned short dir;
        printf("***** Softhiz. *****\n");
        dir = 0xA8;
        // コマンド(レジスタアドレス)送信。
        L6470_write(dir);
        delay(1000);
}

コンパイル

gcc -o wir wir.c -I /usr/local/include -L /usr/local/lib -l wiringPi

最後のsoftstopは、意味ないですし、whileも意味ないですが、
動作差テストには成るかなと。

softstop/hardstop の状態は、トルクを維持しますので、電磁石はONの状態。
発熱します。

HiZ します。

データシート曰く、softhiz は、 10100000 なので、16進数に直すと、A8 に成ります。

wiringpi2 を Python で使う

インストール

$ sudo pip install wiringpi2

動作チェック

$ sudo python
Python 2.7.9 (default, Mar  8 2015, 00:52:26) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import wiringpi
>>> wiringpi.piBoardRev()
2
>>> wiringpi.wiringPiSetup()
0
>>> quit()

コーディング

wiringpi wiringPiSPIDataRW が、2つの引数のみを受け付けるのだが、一体何を渡せばいいのかわからず、調べた。
ソースを読むと、Cにそのまま第2変数を投げているだけに見える・・・。

Gadgetoid commented on 2 Apr 2013 Amazingly late to the game here, but I have started maintaining WiringPi again in the form of a new version which you can find here: https://github.com/WiringPi/WiringPi2-Python The function wiringPiSPIDataRW now takes two arguments, pin and the string. Length and conversion to the correct datatype is handled internally. You should be able to call it thus: wiringPiSPIDataRW(1,'badger') I am the sole maintainer of this package, and had more pressing distractions. I'm tremendously late in getting it updated and offer my apologies. I'd love to see you guys come back to WiringPi2-Python and test it out; I'll be around to attempt to fix any problems you might have.

Pin, String らしい。

別のスレッドも探してみたら、

Python 2.7 なら、 (Int Pin, Str Data ) もしくは (Int Pin, Chr Data )で、
Python 3 なら、(Int Pin, Bytes Data)

らしい。

2.7 系で、 Str Data とうことだが、255 = 0xFF を Strで渡すというのは、"0xFF" を渡すのか、 "FF" を渡すのか、、、。

試行錯誤の結果として、
とりあえず、0xFF (int型)を、struct.pack で、ununsigned char型に変換して投げるようにしたら、動いた・・・。
これで正しいのだろうか。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import wiringpi as wp
import time
import struct

L6470_SPI_CHANNEL       = 0
L6470_SPI_SPEED         = 1000000

def L6470_write(data):
        data = struct.pack("B", data)
        wp.wiringPiSPIDataRW(L6470_SPI_CHANNEL, data)

def L6470_init():
        # MAX_SPEED設定。
        # レジスタアドレス。
        L6470_write(0x07)
        # 最大回転スピード値(10bit) 初期値は 0x41
        L6470_write(0x00)
        L6470_write(0x41)

        # KVAL_HOLD設定。
        # レジスタアドレス。
        L6470_write(0x09)
        # モータ停止中の電圧設定(8bit)
        L6470_write(0xFF)

        # KVAL_RUN設定。
        # レジスタアドレス。
        L6470_write(0x0A)
        # モータ定速回転中の電圧設定(8bit)
        L6470_write(0xFF)

        # KVAL_ACC設定。
        # レジスタアドレス。
        L6470_write(0x0B)
        # モータ加速中の電圧設定(8bit)
        L6470_write(0xFF)

        # KVAL_DEC設定。
        # レジスタアドレス。
        L6470_write(0x0C)
        # モータ減速中の電圧設定(8bit) 初期値は 0x8A
        L6470_write(0x40)

        # OCD_TH設定。
        # レジスタアドレス。
        L6470_write(0x13)
        # オーバーカレントスレッショルド設定(4bit)
        L6470_write(0x0F)

        # STALL_TH設定。
        # レジスタアドレス。
        L6470_write(0x14)
        # ストール電流スレッショルド設定(4bit)
        L6470_write(0x7F)

def L6470_run(speed):
        # 方向検出。
        if (speed < 0):
                dir = 0x50
                spd = -1 * speed
        else:
                dir = 0x51
                spd = speed

        # 送信バイトデータ生成。
        spd_h   =  (0x0F0000 & spd) >> 16 
        spd_m   =  (0x00FF00 & spd) >> 8 
        spd_l   =  (0x00FF & spd) 

        # コマンド(レジスタアドレス)送信。
        L6470_write(dir)
        # データ送信。
        L6470_write(spd_h)
        L6470_write(spd_m)
        L6470_write(spd_l)

def L6470_softstop():
        print("***** SoftStop. *****")
        dir = 0xB0
        # コマンド(レジスタアドレス)送信。
        L6470_write(dir)
        time.sleep(1)

def L6470_softhiz():
        print("***** Softhiz. *****")
        dir = 0xA8
        # コマンド(レジスタアドレス)送信。
        L6470_write(dir)
        time.sleep(1)

if __name__=="__main__":
        speed = 0

        print("***** start spi test program *****")

        # SPI channel 0 を 1MHz で開始。
        #wp.wiringPiSetupGpio()
        wp.wiringPiSPISetup (L6470_SPI_CHANNEL, L6470_SPI_SPEED)

        # L6470の初期化。
        L6470_init()

        while True:
                for i in range(0, 10):
                        speed = speed + 2000 # 30000 位まで
                        L6470_run(speed)
                        print("*** Speed %d ***" % speed)
                        time.sleep(1)

                for i in range(0, 10):
                        speed = speed - 2000
                        L6470_run(speed)
                        print("*** Speed %d ***" % speed)
                        time.sleep(1)

                L6470_softstop()
                L6470_softhiz()
                quit()
        quit()

リレーとソレノイドを試す

3V小型リレー 接点容量:1A Y14H-1C-3DS を試します。

目標 ソレノイド 5V ZHO-0420S-05A4.5 プッシュ型 を動かします。

ソレノイド

5V ZHO-0420S-05A4.5 プッシュ型

◆主な仕様
・定格電圧:DC5V
・定格電流:1.1A(@DC5V、20℃)
・定格電力:5.5W
・使用電圧範囲:DC5V±5%
・直流抵抗:4.5±5%Ω(周囲温度20℃)
・ストローク:3mm
・プッシュ力:80g(最少)@DC5V
・寿命:30万回(サイクル条件:1秒通電、3秒休止)
・ケーブル長:50mm
・コネクタ:2P 2mmピッチ
・取り付け穴:1.5mm×2(タップなし)
・重量:13g

ということです。

試しに、単3電池*2を直列に繋いで、約 3.0v を通電させた所、カチッ と、動きました。

f:id:pongsuke:20160912142217j:plain

f:id:pongsuke:20160912142242j:plain

1.1A で動かくということですが、安定化電源で、5v で電流を変化させた所、 0.4A 程度で動きだしました。
1A 流せば、なかなか力強い感じです。

リレー

接点容量:1A Y14H-1C-3DS

f:id:pongsuke:20160912141355j:plain

・コイル電圧:3V 約50mA
・接点:1C
・接点容量:1A 24VDC/0.5A 125VAC

コイルに流す電流(操作)は、3V で、
切換接点(Cタイプ)が1回路 有り、 接点は 24Vなら、1A までいけます、、、という意味でしょうか?

回路図だけみても、わからなくなるので、注釈を書き入れてみた。

f:id:pongsuke:20160912144040j:plain

最初に、リレー自体には極性が無いようなので、コイルも、動作電源も + と - は、適宜入れ替えて使える。

動作電源+ の甲と乙は、別にどちらに繋いでもいい。

動作電源- の N.O と N.C は、Normally Open と Normally Close のつもり。
操作電流が流れていない場合(平常時)に、On になる側と、 Off になる側。

操作電流が流れていない時は、 N.O がつながっていて、操作電流が流れると、N.C がつながる。

配線

f:id:pongsuke:20160912165209j:plain

ブレッドボードにリレーをどう刺すか悩みました。

中央をまたいで刺せると楽だったんですが、むりなので、端っこに出っ張らせて、クリップコードではさみました。

プログラム

#!/usr/bin/python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import signal
import sys
import time

GPIO_ID = 26
GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_ID, GPIO.OUT)

def exit_handler(signal, frame):
        # Ctrl+Cが押されたときにデバイスを初期状態に戻して終了する。
        print("\nExit")
        GPIO.cleanup()
        sys.exit(0)

# 終了処理用のシグナルハンドラを準備
signal.signal(signal.SIGINT, exit_handler)

while True:
        GPIO.output(GPIO_ID, True)
        time.sleep(0.5)
        GPIO.output(GPIO_ID, False)
        time.sleep(0.5)

実行すると、カチカチ動くのですが、ディスプレイがおかしい。
ノイズが出ていると思われます。

ノイズ対策

正確な知識が問われるところですが、、、調べた所、幾つかの方法が有り、コンデンサーを入れる方法でも効果が出ることがあるようだ。

とりあえず、DCモーター用に購入してあった 0.01µF を入れてみたところ、改善されました。

Raspberry pi Zero を試す

Raspberry pi Zero を試す

人気すぎて、一人一つしか売ってくれない。

重量が軽すぎて安定しないという意見を沢山見たので、最初からアクリルのケースに入れました。

f:id:pongsuke:20160809104928j:plain

Zero の特徴

  1. 小さい

  2. 軽い

  3. マイクロUSBが2ポート有るだけ(給電と通信)

  4. HDMIが、ミニHDMI

  5. オーディオジャックは無い

  6. Ethernet ポートもない

なので、microUSB > USB > USBHUB だとか、

USBイーサネット > USBHUB だとかする。

OS

Raspbian Jessie Lite を入れてみました。

  1. microSD を、SDFormatter

  2. ダウンロードしてきたISO を、Win32DiskImager で焼く

  3. Boot

GPIO

# apt-get install wiringpi

# gpio readall
 +-----+-----+---------+------+---+-Pi Zero--+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+-Pi Zero--+---+------+---------+-----+-----+

プルアップ/ダウン抵抗 について

プルアップ/ダウン抵抗がどうなっているのか。

pinout.xyz

https://www.raspberrypi.org/wp-content/uploads/2012/10/Raspberry-Pi-R2.0-Schematics-Issue2.2_027.pdf

を眺める。

PIN GPIO コメント
3 2 SDA (i2c Data) is one of the i2c pins on the Pi, learn more about i2c.
SDA includes a fixed, 1.8 kohms pull-up to 3.3v, which means this pin is not suitable for use as a general purpose IO where no pullup resistor is desired.
5 3 SCL (i2c Clock) is one of the i2c pins on the Pi, learn more about i2c.
SCL includes a fixed, 1.8 kohms pull-up to 3.3v, which means this pin is not suitable for use as a general purpose IO where no pullup resistor is desired.

f:id:pongsuke:20160804110812j:plain

GPIO2,3 は 1.8kΩ固定、その他は、制御可能な 50KΩ らしい。

GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_UP);
GPIO.setup(pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN);

など。

初期状態・・・も、調べよう。

二酸化炭素センサー MH-Z19

二酸化炭素センサー MH-Z19 を試す。

f:id:pongsuke:20160803135531j:plain

Applications
It is widely used in the HVAC refrigeration and indoor air quality monitoring.
Note: Please let us know the measuring range you need in the Remarks.
If no remarks, we will ship 0~5000ppm by default.

データシート
http://eleparts.co.kr/data/design/product_file/SENSOR/gas/MH-Z19_CO2%20Manual%20V2.pdf

Technical Parameters and Structure
Product Model MH-Z19
Target Gas CO2
Working voltage 3.6 ~ 5.5 V DC
Average current < 18 mA
Interface level 3.3 V
Measuring range 0 ~ 0.5% VOL optional
Output signal
UART
PWM
Preheat time 3 min
Reponse Time T90 < 60 s
Working
temperature
0 ~ 50 ℃
Working humidity
0 ~ 95% RH
(No condensation)
Dimension
33 mm×20 mm×9 mm
(L×W×H)
Weight 21 g
Lifespan > 5 years

f:id:pongsuke:20160803135955j:plain

f:id:pongsuke:20160803140000j:plain

PWM用の配線

PWMだけなら 右側3つしか使わない。

PWM : GPIO21
AOT : (開けたまま)
GND : GND
Vin : 5v

に接続した。

PWM 制御の情報

  1. Output Data Reading
    7.1 PWM output (taking PWM output from 2000ppm as example)
    CO2 output range: 0ppm-2000ppm
    Cycle: 1004ms ± 5%
    High level output for beginning: 2ms ± 5%
    Middle of cycle: 1000ms ± 5%
    Low level output for ending: 2ms ± 5%

f:id:pongsuke:20160803145702j:plain

とある。

High(1), Low(0), High と繰り返すわけですが、その周期は 約 1000ms で、High の始まりと Low の終わりに 2ms つくと。

データシートの例は Range が 2000ppm の場合だから、5000ppmで納品されているはずだから、全部 High なら 5000ppm ということか。

Python コード

PWMの読み取りをする。

High の時間(Span)とLowの時間(Span) で、結果を読み取る。

Cycle が狂っていなければ、片方だけでも答えに繋がるけど、風を当てたりして計測テストすると、 Cycle が異常に成ったりするので、Cycle自体も見たい所。

頭が混乱するポイント

HighのSpanとLowのSpanの計算がわからなくなる。

最後に High だった時刻(Lowに成った瞬間) と 最後に Low だった時刻(Highに成った瞬間)と考える。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
 
PIN_PWM = 21

def getPwm():
        GPIO.setwarnings(False)
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(PIN_PWM,GPIO.IN)
        time.sleep(0.2)

        while GPIO.input(PIN_PWM) == 1:
                last_high = time.time()
        while GPIO.input(PIN_PWM) == 0:
                last_low = time.time()
        while GPIO.input(PIN_PWM) == 1:
                last_high = time.time()

        span_high = (last_high - last_low) * 1000
        print("span_high : " + str(span_high))


        while GPIO.input(PIN_PWM) == 0:
                last_low = time.time()
        while GPIO.input(PIN_PWM) == 1:
                last_high = time.time()
        while GPIO.input(PIN_PWM) == 0:
                last_low = time.time()

        span_low = (last_low - last_high) * 1000
        print("span_low : " + str(span_low))

        print("Cycle : " + str(span_high + span_low))

        co2     = 5000 * ( span_high - 2 ) / ( span_high + span_low - 4 )
        GPIO.cleanup()
        return co2
         
print getPwm()

実行結果

$ ./pwm.py 
span_high : 167.595148087
span_low : 836.373090744
Cycle : 1003.96823883
828.002038746

室内で 828 ppm というのはどうなんだろうか。

窓を開けてしばらくしたら、 600 ppm 程度までは下がり、 ベランダでは、 450 ppm 程度までは下がった。

外気で400ppm でキャリブレーションが必要だろうか?

volumio + i2S を試す

volumio OS + I2S を試す。

f:id:pongsuke:20160809104830j:plain

ハードウェアはこれ。

www.amazon.co.jp

インストールまで

ISO のダウンロード

https://volumio.org/get-started/

から。

SDカードの準備

  1. SDformatter で フォーマット

  2. Win32DiskImager で ISO を焼く

起動と初期設定

マイクロSDカードを刺して起動。

初期ユーザーは、 root / volumio のみだった。

ネットワークの設定ファイルは

# cat /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
#iface eth0 inet dhcp
iface eth0 inet static
address 192.168.100.90
netmask 255.255.255.0
gateway 192.168.100.1
dns-nameserver 192.168.100.1

初期設定

vim を入れる
# apt-get update
# apt-get insatll vim

vi へのエイリアスは自動ではられていた。

キーボードの設定

Volumio 設定

Playback options

Output Device Hifiberry DAC Plus DAC Model Hifiberry DAC Plus

で動かす。