INA226 を RasPi の ruby でi2c

PCB が組みあがったのですが、これを RasPi で i2c するサンプルをググってみたら、いくつかありました。

RasPi は、i2c が使えるようにモジュールをロードしておきました。RasPi でi2c は初めて使います。無事に出来るでしょうか?

# lsmod
Module                  Size  Used by
★i2c_dev                 6027  0 
cfg80211              386508  0 
rfkill                 16651  1 cfg80211
rpcsec_gss_krb5        20958  0 
nfsd                  263569  2 
snd_bcm2835            18649  0 
snd_pcm                73475  1 snd_bcm2835
snd_seq                53078  0 
snd_seq_device          5628  1 snd_seq
snd_timer              17784  2 snd_pcm,snd_seq
snd                    51038  5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
★i2c_bcm2708             4990  0 
joydev                  8879  0 
spi_bcm2708             5137  0 
evdev                   9950  2 
uio_pdrv_genirq         2958  0 
uio                     8119  1 uio_pdrv_genirq

 

先輩たちがサンプルコードは書いているはずなので、探したところ、python でやるのとか、ruby でやるのとかがすぐ見つかりました。

とりあえず、動作確認したいので以下のサイトのコードを参考に必要な部分だけ使わせてもらいました。

Rabbit Note

BeagleBone Black で作るロギング機能付き電力計 (ソフト編)

BeagleBone Black(BBBと略するようです)での環境ですが、大変参考になりました。

使わせていただいたコードは最下部に付けておきます。で、配線は写真のようにちょっと雑ですが配線。負荷には、ちっさいファンをつけてみました。

SingleShot0023 スレーブアドレスは、何も設定しないと、0x40 が設定されるようです。

# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --  

 

プログラムを起動すると、以下のようになります。

# ./test.ruby
--------- 2016/01/25, 01:33:22
4.78125 V
151 mA
0.29 W
--------- 2016/01/25, 01:33:22
4.78125 V
151 mA
0.289 W
--------- 2016/01/25, 01:33:23
4.78875 V
152 mA
0.291 W
--------- 2016/01/25, 01:33:23
4.7875 V
151 mA
0.29 W
--------- 2016/01/25, 01:33:24
4.7875 V
150 mA
0.289 W
--------- 2016/01/25, 01:33:24
4.7875 V
151 mA
0.29 W
--------- 2016/01/25, 01:33:25
4.79 V
152 mA
0.292 W

負荷にLED を点けてみると、以下のようです。

# ./test.ruby 
--------- 2016/01/25, 01:35:31
4.88 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:31
4.88 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:31
4.9125 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:32
4.91375 V
2 mA
0.005 W
--------- 2016/01/25, 01:35:32
4.91375 V
2 mA
0.005 W

 

まだあまりちゃんと理解していませんが、内部のレジスタの ox05 に、キャリブレーションする設定値を入れるようです。

以下の C のサンプルコードから、シャント抵抗に0.025R を使っている場合は、以下のように計算した16進数を入れればよいようです。書き込むとき、以下のコードでは、リトルエンディアンに変換していました。

https://github.com/jarzebski/Arduino-INA226/blob/master/INA226.cpp

0.025Ω = 0.00512/(0.025*0.0001)=2048 = 0x08 0x00

 

0x05 の補正レジスタを見てみると、

# i2cget -y 1 0x40 0x05 w

0x0008

という値が帰ってきました。

 

さて、そんな感じでとりあえずコードは以下のようにしてみました。

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
 
IOCTL_I2C_SLAVE = 0x0703
 
# Script for power meter using the following parts
# - Power Meter module (IC: INA226)

# # i2cdetect -y 1
#      0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
# 00:          -- -- -- -- -- -- -- -- -- -- -- -- --
# 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 40: 40 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
# 70: -- -- -- -- -- -- -- --

class PowerSenseor
  def initialize(i2c_bus=1, dev_addr=0x40)
    @i2c = File.open(sprintf('/dev/i2c-%d', i2c_bus), 'rb+')
    @i2c.ioctl(IOCTL_I2C_SLAVE, dev_addr)

    @dev_addr = dev_addr
    @v_val = 0
    @c_val = 0
    @p_val = 0

    # shunt resistor = 0.002Ω = 0.00512/(0.002*0.001)=2560 = 0x0a 0x00
    #                  0.025Ω = 0.00512/(0.025*0.0001)=2048 = 0x08 0x00
    #   内部レジスタ[0x04] (Current) = 内部レジスタ[0x01]×内部レジスタ[0x05] / 2048
    exec_cmd("i2cset -y 1 0x#{dev_addr.to_s(16)} 0x05 0x08 0x00 i")
    # conversion time = 332us, number of average = 16
    exec_cmd("i2cset -y 1 0x#{dev_addr.to_s(16)} 0x00 0x04 0x97 i")
  end

  def sense
    # i2cset/i2cget は 10ms オーダーの時間を消費するのでここでは使用しない 
    @i2c.write(0x02)
    @v_val = conver_signed(@i2c.read(2))

    # 0x04 電流レジスタ
    @i2c.write(0x04)
    @c_val = conver_signed(@i2c.read(2))

    # 0x03 Powerレジスタ
    @i2c.write(0x03)
    @p_val = conver_signed(@i2c.read(2))
  end

  def conver_signed(bytes)
    # convert endian
    return bytes.unpack('n').pack('S').unpack('s')[0].abs
  end

  def get_voltage
    return calc_voltage(@v_val)
  end

  def get_current
    return calc_current(@c_val)
  end

  def get_power
    return calc_power(@p_val)
  end

  def exec_cmd(cmd)
    val=`#{cmd} 2> /dev/null`
    raise StandardError, "FAIL: #{cmd}" unless $?.success?
    return val
  end

  def calc_voltage(v_val)
    return v_val * 1.25 / 1000.0
  end

  # 0x04 電流レジスタ
  def calc_current(c_val)
    return c_val / 10
  end

  # 0x03 Powerレジスタ
  def calc_power(p_val)
    # return p_val * 0.025
    return p_val * 0.001
  end
end

require 'optparse'
params = ARGV.getopts('lq')

data_list = []

Signal.trap(:INT){
  if params['l'] then
    printf("time,voltage,current,power\n")
    data_list.each{|data|
      printf("%10d,%.3f,%.3f,%.3f\n", data[0], data[1], data[2], data[3])
    }
  end
  exit(0)
}

sensor = PowerSenseor.new
require "date"

start_time = Time.now
i = 0
while true
  sensor.sense
  v = sensor.get_voltage
  c = sensor.get_current
  p = sensor.get_power

  dt = DateTime.now
  print "--------- "
  print(dt.strftime("%Y/%m/%d, %H:%M:%S"), "\n")

  print v
  print " V\n"
  print c
  print " mA\n"
  print p
  print " W\n"

  if ((i & 0x7F) == 0) then

  else
    sleep 0.5
  end
  i = (i & 0xff) + 1
end

 

▼まとめ

・0x05 にシャント抵抗値を入れた補正値を書き込む

・書き込む最は、16進をリトルエンディアンにして書き込む

・0x04 はPowerレジスタで、0x04 は電流レジスタ。

・LSB ってなに?

・ちっこい今使っているファンは、150mA くらい使っていて0.3W ほど

・c のサンプルはすぐに見つからなかったけども、どうんな感じになるんだろう?

・自分で作ったハードが動いてうれしぃ!

・レジスタって、どういう回路なの? どういう仕組みで覚えているんだろう?

DietPi

OrangePi のフォーラムにやっと登録されたので(管理人による手動登録なんですよ)フォーラムをいろいろ散歩してみました。

オレンジパイフォーラムの中のスレッド

DietPi (OrangePi Forum)

なんだろうなと見ていたら、スリム化されたRasPi 系の OS のようです。オフィシャルサイトは以下のようでした。

DietPi

入れたら、パッケージを選択してすぐに使えるようしてあるのがコンセプトのようです。

ドキュメント的なものは、以下にあります。

DietPi-Software

まだダウンロードしただけで、実機では動作させていませんが、パッケージ作りの参考にしたいなぁと思います。まぁ、個人的に興味を引いたのは、DietPi-Config というツールがあるようで、これの作りがどのようになっているか気になりました。

オフィシャルのGitHun はこちらのようです。

GitHub : Fourdee/DietPi

今年の1/6 にリリースされたv105 をダウンロードしました。今度、遊んでみようと思います。

あと、rpix86 という MSDOS のエミュレータも動作するようで、ちょっとメモしておきます。MSDOS に移植されたプログラムは結構あるので、そこそこ楽しめるのではと思っていますが。ますます、もう一台欲しくなってきました。

 

rpix86_icon

http://rpix86.patrickaalto.com/

4dos

 

なお、Lakka や、RetroPi は OrangePi ではインストールスクリプトでこけるようで(そりゃそうだ)動いたよという報告はまだないようです。マニュアルビルドしたら動きますかね?だれか試してみて~。

ちなみに、OrangePi One はカードサイズより小さい感じのようです。1/25 日に出荷予定だそうです。2月には楽しめそうかな?

opione

ということで、OPI PC をもう一台ぽちるのを我慢して、酔っ払ってねることにします。

RasPi2 でCの王道? WiringPi

とりあえず、RasPi でC を検索したら一番最初にヒットしたので、これで。

オフィシャル
http://wiringpi.com/

GITHUB

https://github.com/WiringPi

Ruby や PHP やPython などのラッパーもあるようです。とりあえず、c で。

 

インストールは、INSTALL か、オフィシャルサイトのドキュメントのように。build スクリプトがあります。

[root@pi wiringPi 12/04 05:34:23]# ./build 
wiringPi Build script
=====================


WiringPi Library
[UnInstall]
[Compile] wiringPi.c
[Compile] wiringSerial.c
[Compile] piHiPri.c
[Compile] wiringShift.c
[Compile] piThread.c
[Compile] wiringPiSPI.c
[Compile] softPwm.c
[Compile] wiringPiI2C.c
[Compile] softTone.c
[Compile] mcp23008.c
[Compile] mcp23016.c
[Compile] mcp23017.c
[Compile] mcp23s08.c
[Compile] mcp23s17.c
[Compile] pcf8574.c
[Compile] sr595.c
[Compile] mcp3002.c
[Compile] pcf8591.c
[Compile] mcp3004.c
[Compile] mcp4802.c
[Compile] mcp3422.c
[Compile] max31855.c
[Compile] max5322.c
[Compile] sn3218.c
[Compile] drcSerial.c
[Compile] wpiExtensions.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

WiringPi Devices Library
[UnInstall]
[Compile] ds1302.c
[Compile] maxdetect.c
[Compile] piNes.c
[Compile] gertboard.c
[Compile] piFace.c
[Compile] lcd128x64.c
[Compile] lcd.c
[Compile] piGlow.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

GPIO Utility
[Compile] gpio.c
[Compile] readall.c
[Compile] pins.c
[Link]
[Install]

All Done.

NOTE: To compile programs with wiringPi, you need to add:
    -lwiringPi
  to your compile line(s) To use the Gertboard, MaxDetect, etc.
  code (the devLib), you need to also add:
    -lwiringPiDev
  to your compile line(s).

[root@pi wiringPi 12/04 05:38:22]# gpio -v
gpio version: 2.31
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 2, Revision: 01, Memory: 1024MB, Maker: Embest 
  Device tree is enabled.
  * Root or sudo required for GPIO access.
[root@pi wiringPi 12/04 05:38:41]# 

こんな感じになりました。

[root@pi wiringPi 12/04 05:38:45]# gpio -v
gpio version: 2.31
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 2, Revision: 01, Memory: 1024MB, Maker: Embest 
  Device tree is enabled.
  * Root or sudo required for GPIO access.
[root@pi wiringPi 12/04 05:38:46]# 

というバージョンを使っています。Gordon Hendersonさんが作られてたようです。感謝。

[root@pi work 12/04 06:17:08]# gpio -warranty
gpio version: 2.31
Copyright (c) 2012-2015 Gordon Henderson

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU Leser General Public License as published
    by the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this program. If not, see <http://www.gnu.org/licenses/>.

[root@pi work 12/04 06:17:14]# 

とりあえず、使ってみます。

a

いつもPIN番号を忘れて検索します。貼り付けておくことに。ラズパイのピン。

Raspberry-Pi-GPIO-compressed

コードは以下。

// Include header file
#include <wiringPi.h>

// Define GPIO21 number
#define LED 21

// Main function
int main(void) {
        int i;

        // Initialize WiringPi
        if(wiringPiSetupGpio() == -1) return 1;

        // Set GPIO pin to output mode
        pinMode(LED, OUTPUT);

        // Repeat LED blinking 10 times
        for(i=0; i<100; i++){
                digitalWrite(LED, 0);
                delay(100);
                digitalWrite(LED, 1);
                delay(100);
        }

        // Turn off LED
        digitalWrite(LED, 0);

        return 0;
}

コンパイル、実行。

[pi@pi work]gcc -o blink blink.c -lwiringPi
[pi@pi work] sudo ./blink

終了すると、プロンプトに戻ります。RasPi のGPIOはたくさんあるので、同時にいくつ使えるんでしょうね。

 

シフトレジスターを経由しなくても、今回、15本のGPIOを使えればよさそうですが、

[root@pi work 12/04 06:26:32]# gpio readall
 +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 |   2 |   8 |   SDA.1 | ALT0 | 1 |  3 || 4  |   |      | 5V      |     |     |
 |   3 |   9 |   SCL.1 | ALT0 | 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 | ALT0 | 0 | 19 || 20 |   |      | 0v      |     |     |
 |   9 |  13 |    MISO | ALT0 | 0 | 21 || 22 | 0 | OUT  | GPIO. 6 | 6   | 25  |
 |  11 |  14 |    SCLK | ALT0 | 0 | 23 || 24 | 1 | ALT0 | CE0     | 10  | 8   |
 |     |     |      0v |      |   | 25 || 26 | 1 | ALT0 | 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 | OUT  | GPIO.29 | 29  | 21  |
 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
[root@pi work 12/04 06:26:33]# 

このテーブルのwPi というのがアサインされている番号ですかね。

マニュアルだと、以下のようです。1 でON(点灯) 0でOFF(消灯)

[root@pi work 12/04 06:32:40]# gpio -g write 21 1 
[root@pi work 12/04 06:33:56]# gpio -g write 21 0

とりあえず、使えそうですね。あとは、プログラムの問題となります。さぁて、本日金曜日。お仕事終わればまた開発タイムです。

examples ディレクトリに参考コードがたくさんあります。

[root@pi examples 12/04 06:41:26]# pwd
/home/pi/wiringPi/examples
[root@pi examples 12/04 06:41:28]# 
[root@pi examples 12/04 06:41:29]# tree
.
├── blink12.c
├── blink12drcs.c
├── blink6drcs.c
├── blink8.c
├── blink.c
├── blink.rtb
├── blink.sh
├── clock.c
├── COPYING.LESSER
├── delayTest.c
├── ds1302.c
├── Gertboard
│   ├── 7segments.c
│   ├── buttons.c
│   ├── gertboard.c
│   ├── Makefile
│   ├── record.c
│   ├── temperature.c
│   ├── voltmeter.c
│   └── vumeter.c
├── header.h
├── isr.c
├── isr-osc.c
├── lcd-adafruit.c
├── lcd.c
├── lowPower.c
├── Makefile
├── max31855.c
├── nes.c
├── okLed.c
├── PiFace
│   ├── blink.c
│   ├── buttons.c
│   ├── ladder.c
│   ├── Makefile
│   ├── metro.c
│   ├── motor.c
│   └── reaction.c
├── PiGlow
│   ├── Makefile
│   ├── piGlow0.c
│   ├── piGlow1.c
│   └── piglow.c
├── pwm.c
├── q2w
│   ├── binary.c
│   ├── blink.c
│   ├── blink-io.c
│   ├── blink.sh
│   ├── bright.c
│   ├── button.c
│   ├── Makefile
│   └── volts.c
├── README.TXT
├── rht03.c
├── serialRead.c
├── serialTest.c
├── servo.c
├── softPwm.c
├── softTone.c
├── speed.c
├── spiSpeed.c
└── wfi.c

4 directories, 59 files
[root@pi examples 12/04 06:41:32]# 

 

コハクラフトさんからも発送されたようで、土日にはなんらか楽しめそうです。

15ドルのOrange Piで遊び倒す

遊びがいがありそうなので、ポチりました! 動機としては、OpenStack のARMビルド版を動かすのを目標にしています。

 

CPU には、allwinner のH3 というアーキテクチャーネームはsun8iw7p1 というものが載っています。

4K に対応した H.265/HEVC 4K@30fps のデコードが出来るんですよ。そして、4コアですよ。1.6Ghz で動作して、こんなのが2300円で買えてしまうなんて。もう驚きです。!!!どうやら、これは30ドル~50ドルくらいのSTBを対象に開発されたようで、価格は6ドルとのこと。

H3_Allwinner_TechnologyH3_Allwinner_Technology 2

Allwinner_H3_Datasheetv1.1

UnixBench ではRasPi(2じゃないやつ)よりも速いはずです。到着したら、自身で計測してみますが、他者の結果は以下のようです。RasPi2 より速ければ、うれしいですね。スペック的には速いはずです。以下のベンチマークは、Orange Pi(AllWinner A20)のもの。

参考ソース

http://pastebin.com/chsgAxw2

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)
 
   System: OrangePI: GNU/Linux
   OS: GNU/Linux -- 3.4.39 -- #1 SMP PREEMPT Wed Sep 16 13:39:07 CEST 2015
   Machine: armv7l (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   16:00:08 up 31 min,  1 user,  load average: 3.00, 3.09, 2.76; runlevel 2
 
------------------------------------------------------------------------
Benchmark Run: Sat Sep 19 2015 16:00:08 - 16:28:23
0 CPUs in system; running 1 parallel copy of tests
 
Dhrystone 2 using register variables        5193714.8 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                      791.3 MWIPS (10.1 s, 7 samples)
Execl Throughput                                349.9 lps   (29.9 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        121696.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks           36652.0 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks        277558.9 KBps  (30.0 s, 2 samples)
Pipe Throughput                              323747.0 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                  12225.1 lps   (10.0 s, 7 samples)
Process Creation                               1044.4 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   1433.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    472.1 lpm   (60.0 s, 2 samples)
System Call Overhead                         854375.1 lps   (10.0 s, 7 samples)
 
System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0    5193714.8    445.0
Double-Precision Whetstone                       55.0        791.3    143.9
Execl Throughput                                 43.0        349.9     81.4
File Copy 1024 bufsize 2000 maxblocks          3960.0     121696.0    307.3
File Copy 256 bufsize 500 maxblocks            1655.0      36652.0    221.5
File Copy 4096 bufsize 8000 maxblocks          5800.0     277558.9    478.5
Pipe Throughput                               12440.0     323747.0    260.2
Pipe-based Context Switching                   4000.0      12225.1     30.6
Process Creation                                126.0       1044.4     82.9
Shell Scripts (1 concurrent)                     42.4       1433.6    338.1
Shell Scripts (8 concurrent)                      6.0        472.1    786.9
System Call Overhead                          15000.0     854375.1    569.6
                                                                   ========
System Benchmarks Index Score                                         225.1

 

-c 4 のオプションをつけてないようなので、おそらくRasPi2 よりも速いはず。

 

orangepipc_info オフィシャルサイトには、サポートOSは以下のようです。

orange_pi_homepage_-_Orangepi

www_orangepi_org_downloadresources_ ラインナップは以下のようです。最初の1つを選ぶとしたら、一番安いものでとりあえずいいかなと思ったので、15ドルのOrange Pi PC にしました。大きな違いは、NIC がGB対応にするか、WiFi 付きを選ぶか、SATA も付くのを選ぶか、eMMC8GB のストレージ付きを選ぶかです。

  Orange Pi Orange Pi Plus Orange Pi 2 Orange Pi PC Raspberry Pi 2 Model B
Processor AllWinner A20 Allwinner H3 Allwinner H3 Allwinner H3 Broadcom BCM2836
CPU cores 4x Cortex-A7 @ 1GHz 4x Cortex-A7 @ 1.6GHz 4x Cortex-A7 @ 1.6GHz 4x Cortex-A7 @ 1.6GHz 4x Cortex-A7 @ 900MHz
GPU PowerVR SGX544MP2 ARM Mali-400 MP2 ARM Mali-400 MP2 ARM Mali-400 MP2 Broadcom VideoCore IV
RAM 1GB 1GB 1GB 1GB 1GB
Storage microSD, SATA 2.0 microSD, SATA 2.0, 8GB eMMC microSD microSD microSD
Wireless WiFi WiFI WiFi
Ethernet Gigabit Gigabit 10/100 10/100 10/100
A/V I/O HDMI, composite, LVDS, VGA HDMI, composite HDMI, composite HDMI, composite HDMI, composite
Camera CSI CSI CSI CSI CSI
USB ports 4x USB 2.0; 1x USB OTG 4x USB 2.0; 1x USB OTG 4x USB 2.0; 1x USB OTG 3x USB 2.0; 1x USB OTG 4x USB 2.0
Power +5V via micro-USB or barrel jack +5V via micro-USB or barrel jack +5V via barrel jack +5V via barrel jack +5V via micro-USB
Expansion 26-pin Pi-style; 18-pin 40-pin Pi-style 40-pin Pi-style 40-pin Pi-style 40-pin
Dimensions 112 x 60mm 112 x 60mm 93 x 60mm 85 x 55mm 85 x 56mm
Price (less shipping) $49 $59 $30 $15 $35

オリジナルソース

http://linuxgizmos.com/15-dollar-orange-pi-pc-hacker-sbc-packs-quad-core-soc/

価格のバランスから言って、まずは表中の赤いものでいいかなと思いました。

2300円(15ドル+送料)くらいなので、ちょっと遊んでみようかと思います。目標は、オリジナルなOSビルドです。

野良なイメージはあるけれども、ちょっと心配だし、1からCentOS とかのarm 版を作ってみようかと。目標は、OpenStack のARMビルドを走らせること。そして、検証用のOpenStack 環境を作ってみたいなと。

 

アプリケーションであれば、クロスコンパイル環境を作ればARM版のアプリケーションはビルド出来るのでしょうが、OS自体を1からARM ビルドするにはどうしたらいいのでしょうか? このあたりのノウハウも勉強になると思いますので、やってみたいと思います。

 

オリジナルなブートローダーや、セットアップを簡単にするインストーラなども作れたら面白いなと思っていますが、いろいろスキルが必要になりそうですので、勉強しながらやっていきたいです。

 

それにしても、この部品構成でどやったら、15ドルで出せるのかが不思議です。

CPU は6ドルとのことで、大量に買えば安くはなるのであろうけども、中国のパワーはすごいですね。脅威を通りこして畏敬を感じます。安いのはパワーだと!

 

とりあえず、年末年始はこれで楽しめそうです。SUNXIのマニュアルにH3 とか基本的なマニュアルビルドの手順が載っていたのでメモ。

 

sunxi

Manual build howto

H3 Manual build howto

RasPi2 でスタンドアローンThingspeak Server

最初見たときは、Thingspeak をプロキシーするか、API をたたいているんだと思っていましたが、これは単体で動作するっていうことなんでしょうかね?

https://github.com/iobridge/thingspeak

手順を見る限り、MySQL + Ruby + Rails 入れてる感じです。

これをRaspiで動作させて、ESP8266 からのセンサーを投げているブログを見ました。

Raspberry PI – Standalone Thingspeak Server installation
http://www.esp8266-projects.com/2015/05/raspberry-pi-standalone-thingspeak.html

 

今日から夏休みなので、これも題材としたいなと。うまく動けば、RasPi2 + ESP8266 で低消費電力なデータロガーができそうです。

osx のシリアルポートのユーティリティーあれこれ

シリアルをtelnet 経由してつなげるようになったので、ArduinoIDE からシリアルをWiFi で書き込めるようにしてみようとあれこれやること、1日弱。結局、osx では良いツールが見つからずできませんでした。

何ができなかったかと言うと、仮想シリアルポートを作成して、それをArduinoIDE から認識できずで、何かやり方があるんだろうと思います。socat の使い方が悪いんだと思うので、継続して調査。Windows だとこのあたりのツールはたくさんあって、苦労しない感じなので、次回は、Windows でやってみることに。

で、いろいろsocat の使い方を試しているうちに、昨日の疑問が解けました。

・ESP12 の接続IPにつなげて、echo が表示されてしまう問題
・CTL + C など 接続した先でやりたいんだけど、socat の接続元(osx 側)で CTL + C になる問題

これは、以下のようにすれば良いようです。

$ socat STDIN,raw,echo=0 TCP:192.168.1.36:23

raw をつけておけば、そのままコントロール信号も送られるけども、手元のターミナルは中断できないので、ターミナルウィンドウを閉じてしまう感じ。tcpdump とか、WiFi 経由のシリアルから入って採取してるときとか、CTL + C できるし、上矢印のコマンド履歴も、tab 補完キーも効きます。理屈がわかってしまえば、あ、そうかということですが。。。。

 

調べているときに、よくまとまったBlog記事があったので、メモしておきます。

Make RS232 Serial Devices Accessible via Ethernet
http://blog.philippklaus.de/2011/08/make-rs232-serial-devices-accessible-via-ethernet/

最後に、socat でのソケットを分割するには、以下のようにやれば良い事がわかりました。

ishizaka_—_socat_—_ttys008_—_76×23_と_ishizaka_—_socat_—_ttys007_—_76×23_と_ishizaka_—_socat_—_ttys002_—_76×23_と_ishizaka_—_tail_—_ttys009_—_76×36

sudo socat -d -d -d -d -lf /tmp/socat \
pty,\
link=/dev/master,\
raw,\
echo=0,\
user=junkhack,\
group=staff\
\
pty,\
link=/dev/slave,\
raw,\
echo=0,\
user=junkhack,\
group=staff

 

 

どうやって、arduinoIDE のシリアルポートに表示させるかが課題です。

WiFi 経由のシリアルコンソールで、ずっとtcpdump を流してテストしていますが、接続もきれず良い感じです。あと、話は飛びますが、ESP8266 Arduino Core のドキュメント見てましたら、File system も使えるようですね。これはある程度まで、データをメモリに貯めておいて、まとめてWifi 出力でデータを飛ばせば、電力の消費も抑えられそうです。sleep mode の下調べはおおよそ終わったので、コード実装して、電池駆動にしてテストするデバイス作りを夏休み(まだこれからなんですが)にやれればと思っています。ESP8266 、こんなに遊べるとは。まだlua にするのもありますしね。今年いっぱいは遊べる感じです。飽きるか、いきづまらなければね。