How to Use MCP3425 ADC 16-Bit Mode with Raspberry Pi (Python)

Raspberry Pi cannot acquire analog values. However, Arduino is equipped with ADC as standard, but the performance is on the odder of “10-Bit(0 – 1023). The MCP3425 used in this article is 16-Bit and can also perform I2C connection. Furthermore, It’s possible to measure not only positive values but also negative values.

1  Configuration of MCP3425

The Configuration of the MCP3425 is as follows.

%e7%84%a1%e9%a1%8c%e3%81%ae%e5%9b%b3%e5%bd%a2%e6%8f%8f%e7%94%bb-2
Diagram

Wiring diagram of MCP3425 and Raspberry Pi.

untitled-sketch_%e3%83%96%e3%83%ac%e3%83%83%e3%83%89%e3%83%9c%e3%83%bc%e3%83%89
Battery Voltage Measurement Example

Check the I2C connection with the command.

$ sudo i2cdetect -y 1

2  Use MCP3425 with 16-Bit Mode

Control MCP3425 using Python. The following program acquires the analog values and display the voltage values.

$ vi mcp3425.py

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

import smbus
import time
bus = smbus.SMBus(1)
bus.write_i2c_block_data(0x68, 0b10001000, [0x00])
time.sleep(1)

data = bus.read_i2c_block_data(0x68, 0x00, 2)
raw  = data[0] << 8 | data[1]

if raw > 32767:
   raw -= 65535
vol = 2.048 / 32767
print str(raw*vol) + " [V]"

3  Explanation

Bit Value Explanation
Bit 7 1 Initiate a new conversion.
0 No effect.
Bit 6 0 Do not use. Select value 0.
Bit 5 0 Do not use. Select value 0.
Bit 4 1 Continuous conversion mode.
0 One-Shot conversion mode.
Bit 3-2 00 12 Bits. 240 SPS.
01 14 Bits. 60 SPS.
10 16 Bits. 15 SPS.
Bit 1-0 00 PGA Gain x1.
01 PGA Gain x2.
10 PGA Gain x4.
11 PGA Gain x8.

Reference : MICROCHIP – MCP3425 16-Bit Analog-to-Digital Converter with I2C Interface and On-Board Reference – Page 14

3.1  Write Setting

Refer to the above table and set the parameters. The following is the Write Setting. It’s arranged from Bit 7 to Bit 0.

bus.write_i2c_block_data(0x68, 0b10001000, [0x00])

無題の図形描画 (2).png

Radix Reference

Radix Prefix Example
Binary Number 0b 0b110
Octal Number 0o 0o310
Decimal Number 0d 0d209
Hexadecimal Number 0x 0x1F2

3.2  Read Setting

Receive data from MCP3425. Read using “bus.read_i2c_block_data”.

data = bus.read_i2c_block_data(0x68, 0x00, 2)

It’s necessary to properly format the read data.

raw = data[0] << 8 | data[1]

Let’s see what is contained in data[0] and data[1].

%e7%84%a1%e9%a1%8c%e3%81%ae%e5%9b%b3%e5%bd%a2%e6%8f%8f%e7%94%bb

The displayed value is Decimal Number. Conversion work is done in Binary Number.

%e7%84%a1%e9%a1%8c%e3%81%ae%e5%9b%b3%e5%bd%a2%e6%8f%8f%e7%94%bb-1
Conversion Work
%e7%84%a1%e9%a1%8c%e3%81%ae%e5%9b%b3%e5%bd%a2%e6%8f%8f%e7%94%bb-1
Shift

About Shift :

raw = data[0] << 8 | data[1]

%e7%84%a1%e9%a1%8c%e3%81%ae%e5%9b%b3%e5%bd%a2%e6%8f%8f%e7%94%bb-3

3.3  Measurement Result

ccc1

ccc2

Apache2でのBasic認証で発生する500 Internal Server Error問題の解決法

あけましておめでとうございます。2017年第一回目の記事(あけおめ記事は自動のため除く)です。

#0:状況

筆者もBasic認証をVPN上(VPN上でなくても解決できる)でWordPressを運用しているサーバ上にBasic認証を施そうとしたところ500 Internal Server Error (内部サーバエラー)が発生しました。ちなみに使用しているApache サーバはRaspberry Pi – Raspbianです。

Error.png
500 Internal Server Error

書いてる内容は

500 Internal Server Error
サーバ内部でエラーもしくは、構成ミスが発生したため、要求が完了できませんでした。
サーバ管理者に連絡して、エラーが発生した時刻、エラー直前に実行した操作を報告してください。
このエラーの詳細については、サーバエラーログを確認してください。

エラーを引き起こしたのは他でもない管理者である筆者なのだった…。この時に気づけばよかったのだが、『サーバーエラーログ』を見ていればすんなりと解決しました。

筆者もネットでググりまくっても出てくるのは、文字コードによるもの、改行によるもの、ファイルネームが間違っているものと全部試してみても500が解決する様子はない…。

#1:これで解決

最初からエラーログを見ていれば簡単でした。ちなみにlogが保存されているところは、グループがadmなので最初からrootでログインしておきましょう。次の方法で確認します。

$ sudo su
# cat /var/log/apache2/error.log

エラーの内容はいかほどなものか…。

[Sun Jan 01 08:01:43.414406 2017] [core:alert] [pid 1345] [client 25.XXX.XXX.XXX:XXX] /var/www/.htaccess: Invalid command ‘AuthGroupFile’, perhaps misspelled or defined by a module not included in the server configuration, referer: http://25.XXX.XXX.XXX/

AuthGroupFileはどうやら存在しないコマンドということみたいです。viなりで.htaccessを編集してAuthGroupFileの行を削除します。ちなみにこのコマンドは、グループ指定などに使うコマンドですが、なくても問題ないらしい。しかし、問題はこれだけではないみたいです。

[Sun Jan 01 08:11:01.869283 2017] [core:alert] [pid 1321] [client 25.XXX.XXX.XXX:XXX] /var/www/html/.htaccess: AuthName takes one argument, the authentication realm (e.g. “Members Only”), referer: http://25.XXX.XXX.XXX/

AuthNameの構成が間違っているとのこと。ダブルコーテーションのみでくくれ!って言われた…。

#変更前
AuthName "Please enter your ID and password";
#変更後
AuthName "Please enter your ID and password"

これですべてのエラーが解消されて、無事にBasic認証が動作しました。

#2:参考 .htaccess

ここに.htaccessの設定を載せておきます。

set.png
WordPress.comではうまくcodeが実行できないので画像で…。

 

それではよいお年を。

以上

Easy Install Hamachi on Raspberry Pi (Automatic Startup)

For older versions, “lsb” and “lsb-core” were necessary. In this article, “lsb” and “lsb-core” is unnecessary and it is setup until automatic startup.

The version used in this article is 2.1.0.174-1.

$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.174-1_armhf.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.174-1_armhf.deb

After installation please do the following to join Hamachi. The last “hamachi join” is unnecessary if you are using WEB approval, and you can participate by approving it on the WEB.

$ sudo hamachi login
$ sudo hamachi attach [Your Hamachi Email Address]
$ sudo hamachi set-nick [Whatever Nickname You Make]
$ sudo hamachi join [Network ID] [Password]

Finally reboot Raspberry Pi and check whether Hamachi will start automatically.

Raspberry PiとVPNで作るウェブオンラインストレージサーバ

画像や動画、文章などを簡単に保存するとなると昔ならHDDやポータブルHDDなどに保存していました。最近であれば、ウェブオンラインストレージを使えば簡単に画像や動画、文章を転送して、また共有することができます。代表的なサービスとしてはDropboxやGoogle Drive、OneDriveなどがあります。

今回はRaspberry Piを用いてVPN上で運用するウェブオンラインストレージサーバを構築します。使用するものはownCloudと呼ばれるものです。

#1:サーバのセットアップ

サーバのセットアップを行う。セットアップ済みの場合は、この項目を飛ばしても構いません。

今回使用するイメージはRaspbian Jessie Liteで、Raspbian Jessie With Pixelと同様です。

詳しいことはこちらの記事を参考にしてください。


Raspberry Piで実行するVPN上のWordPress

各種参考項目:

#1:Raspberry Piのセットアップ
#1-1:Raspberry Piに必要なイメージをダウンロード
#1-2:ダウンロードしたイメージをMicro SDに書き込む
#1-3:初期起動の設定

#2:VPNの導入
#2-1:Hamachiへの登録
#2-2:クライアントへダウンロード&インストール
#2-3:Raspberry PiをHamachi VPNに参加させる


#2:サーバに必要な条件を整える

Raspberry PiをウェブサーバとするにはApacheやPHPを導入する必要があります。これがなければ表示することが出来ません。

#2-1:Apache2を導入する

ApacheはHTMLを表示するためのものです。下記のコマンドより導入します。

$ sudo apt-get install apache2

先程ifconfigで調べた自身のIPアドレスをブラウザに入力すると次の表示がされます。

2016-12-24
It works!

#2-2:PHP5の導入

PHP5を導入する必要があります。下記のコマンドより導入します。

$ sudo aptitude install php5 php5-curl

#2-3:MySQLの導入

MySQLを導入します。途中でMySQLに設定するパスワードを聞かれますので、設定して下さい。ここでは例として”raspass”とします。二度聞かれるのでどちらも同じパスワードを入力して下さい。

$ sudo apt-get install mysql-server php5-mysql

#2-4:データベースの作成

実際に運用させるためのデータベースを作成します。今回は”ownCloud”というデータベースを作成します。因みにMySQLにログインするには例として”mysql -uroot -praspass”で入ることができます。詳しく説明すると”mysql -u[User Name] -p[Password]”となっています。今回はowncloudというデータベースを作成します。

$ mysql -uroot -praspass
mysql> CREATE DATABASE owncloud;
mysql> exit

#2-5:phpMyAdminの導入

phpMyAdminを導入します。こちらも途中パスワードを聞かれますので問題なければ先程と同じパスワードを使います。嫌だと思う場合は、phpMyAdminで聞かれるパスワードのみを変え、2度目に同じものを入力して下さい。

$ sudo apt-get install phpmyadmin

#3:ownCloudの導入

今回使うオンラインストレージはownCloudを使用します。最新パッケージはこちらをご覧ください。

#3-1:ownCloudをダウンロードする。

$ wget https://download.owncloud.org/community/owncloud-9.1.3.zip
$ unzip owncloud-9.1.3.zip

#3-2:Apache上に配置する

Apache上でWordPressを再現する必要があるため、移動します。

$ sudo cp -r owncloud /var/www/html/owncloud

#3-3:権限問題の解決

どうしても生じるのが権限問題です。www-dataに権限を移譲し、設定を執り行います。

$ sudo chown -R www-data:www-data /var/www/html/owncloud

#4:ownCloudの設定

いよいよownCloudの設定に移ります。

#4-1:アカウント作成

『http://[Hamachi IP Address]/owncloud/』にアクセスしてみましょう。お好みのユーザ名とパスワードを作成します。

Own1.png
アカウントの作成

データベースに接続します。データベースのユーザ名、データベースのパスワード、先ほど作成したデータベース名を入力します。

Own2.png
データベースへのログイン

#4-2:実行してみた

Own3.png
アップロードしてブラウザ上で表示

以上

How to Acquire CPU Temperature and CPU Frequency Using PHP

This article is in English. Sometimes the sentences are wrong. Please be understanding of this beforehand.

How to Acquire the CPU Temperature Using PHP

The temperature displayed is celsius.

echo round((exec('cat /sys/class/thermal/thermal_zone0/temp')/1000),2);

How to Acquire the CPU Frequency Using PHP

The unit displayed is MHz. If there are 4 cores, cpu0 to cpu3.

echo round((exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq')/1000),2);

Operation Example

Raspberry Pi is used for the server. By introducing “Insert PHP” in WordPress you can run PHP with widget.

00_raspi-config_l
Using “Insert PHP”.
00_900mhz
Add Completed.

Change the frequency and check the operation.

00_raspi-config
raspi-config
00_raspi-config_1ghz
Changed from 900MHz to 1000Mhz

00_1000mhz

PHPによるCPU温度とCPU周波数の取得方法

以前にも記事にしましたが、少々解りにくいと思うので書き直したいと思います。

PHPによるCPU温度取得

PHPを使ってCPU温度を取得します。求められている温度は摂氏(°C)です。

echo round((exec('cat /sys/class/thermal/thermal_zone0/temp')/1000),2);

PHPによるCPU周波数取得

PHPを使ってCPU周波数を取得します。求められている周波数はメガヘルツ(MHz)です。オレンジ色で示したのはcpu0の周波数です。コアが4つの場合、cpu0~cpu3ですので編集するとよいでしょう。

echo round((exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq')/1000),2);

Raspberry Piでの導入例

WordPressなら”Insert PHP”でウィジェットにPHPを実行することができます。下の画像は筆者しか見ることのできないテスト環境兼日記のWordPressである。

00_raspi-config_l.png
Insert PHPによる実装例

これによりWordPressのウィジェットに追加することができました。

00_900mhz.png
ウィジェット実装例

実際にきちんと表示されているかを確かめる。クロックを変更して確かめる。ちなみにオーバークロックは自己責任です。

$ sudo raspi-config
00_raspi-config
6 Overclockを選択する
00_raspi-config_1ghz
High 1000MHzを選択する

これによってRaspberry Piは1000MHzで動作する。実際に反映されたかを見る。

00_1000mhz.png
チェンジ後の表示

検証後は元の周波数に変更することを強くお勧めします。

PHPでCPU温度やCPU周波数を取得するプログラム

こんにちは、筆者です。PHPでCPU温度とCPU周波数を取得するプログラムを作成しました。WordPress上でウィジェットなどに実装して使えます。ちなみにウィジェットに実装する場合、『Insert PHP』というプラグインを実装すればよいかと。

  • CPU温度取得

root不要で取得できます。単位は°Cです。

echo round((exec('cat /sys/class/thermal/thermal_zone0/temp')/1000),2);
  • CPU周波数取得

root不要で取得できます。単位はMHzです。

echo round((exec('cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq')/1000),2);
  • ウィジェット実装例

実際にWordPressに実装してみました。サーバーはRaspberry Pi 2でCoreが4つあります。
*cpu0 ~ cpu3まで

server-info
WordPressに実装
  • あとがき

こんな感じで表示できます。よろしければ使ってみてください。

Raspberry PiにHamachiをインストールするのが更に簡単になったので紹介

以前紹介した方法は古いヴァージョンでインストールにはlsbやlsb-coreが必要であった。今回紹介するヴァージョンではパッケージ等の導入する必要がない。

今回使うヴァージョンは2.1.0.174-1である。これ単体でインストールすると、Hamachiの導入とHamachiの自動起動まで設定される。

$ wget https://www.vpn.net/installers/logmein-hamachi_2.1.0.174-1_armhf.deb
$ sudo dpkg -i logmein-hamachi_2.1.0.174-1_armhf.deb

ログイン作業を行えばHamachiのグループに参加することが可能となる。最後のhamachi joinはWEB承認を使っている場合不要で、WEB承認を使っている場合はWEB上から承認すると参加できる。

$ sudo hamachi login
$ sudo hamachi attach [Your Hamachi Email Address]
$ sudo hamachi set-nick [Whatever Nickname You Make]
$ sudo hamachi join [Network ID] [Password]

これでログインが完了となる。Raspberry Piを再起動して自動起動するか確かめてもらいたい。

以上

本日の筆者

こんにちは、筆者です。12月は書く記事もなく終わりそうなのでくだらないことを記事にします。

筆者の本日の昼飯

Amazonのセールにて大量にポテチを購入した筆者。昼飯にはポテチは欠かせないのです。それとからしマヨネーズをつけて食べるのがマイブーム。

からしマヨネーズとコンソメポテトチップス
奇跡のコラボレーション

AMD Athlon 5350でVMware

1年前くらいに筆者はAMDのAthlon 5350という省電力かつ安価なCPUを購入しました。作っていつも満足している筆者。今回は5350を使ってVMwareでUbuntu Mateを動作させたいと思います。そして動作の感想などを報告したいと思います。

インストールに成功

解像度の調整やアップデートをしてきのこタイムをFireFoxでみてみました。動作も問題なく比較的安定していました。これはVMwareだからかもしれませんね!それを加味しても5350で仮想を動かせるとはかなりコスパの良いCPUといえます。ヌルヌル動いてくれました。

実際にサイトを観てみた

 

こんな感じで今日も筆者はダラダラ過ごしています。

以上

RaspberryPiと携帯回線網(+VPN)の死活監視プログラム

こんにちは、筆者です。RaspberryPiと携帯回線網の組み合わせは最強です。しかし、時々ですが携帯回線がダウンしてしまう場合があります。それの対策として死活監視プログラムの作成が必須となります。L-02Cのファームアップデートだけでは対処できないかも…。

Pythonを使ったPingの確認

Pythonを使ったPingの確認は前回の記事に詳しくかいています。pypingを使う方法です。pypingを使うためにはpipで追加する必要があります。

$sudo pip install pyping

LEDを組み合わせる

GPIO 17,27,22 (Board 11, 13, 15)を使います。LEDと抵抗を準備してください。

Pythonで作ってみる(ベータ版)

ちょっと急いで作ったので使用は自己責任で。多分大丈夫だとは思う。送り先と繰り返し調整は注意して下さい。間違えがあればコメントよろしくお願いします。一応確認はしていますが…。

※追記:pypingは多分pingを送るinterfaceがないとエラーが発生します。つまり、エラーが繰り返してしまうトラブルが発生します。これを解消するためpypingのエラーに対して例外処理を施して再起動を円滑に行えるように対処しました。

$vi ping_monitor.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import pyping
import RPi.GPIO as GPIO
import time
import os
import sys
GPIO.setmode(GPIO.BOARD)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
################################################
#確認したいアドレス
host_dns     = "8.XXX.XXX.XXX"
host_vpn_A   = "25.XXX.XXX.XXX"
#代替比較アドレス
host_vpn_B   = "25.XXX.XXX.XXX"
################################################
#tが時間,sがtime sleep
def led_n3_f(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(11, True)
      GPIO.output(13, True)
      GPIO.output(15, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, False)
      GPIO.output(15, False)
      time.sleep(s)
      n += 1
def led_n1_f(led_no, t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(led_no, True)
      time.sleep(s)
      GPIO.output(led_no, False)
      time.sleep(s)
      n += 1
def ping_tp(host_name, led_no, t):
   try:
      r_host = pyping.ping(host_name)
      if r_host.ret_code == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def ping_sb(host_name_A, host_name_B, led_no, t):
   try:
      rA_host = pyping.ping(host_name_A)
      rB_host = pyping.ping(host_name_B)
      rAB     = (rA_host.ret_code) * (rB_host.ret_code)
      if rAB == 0:
         led_n1_f(led_no, t, 0.1)
         GPIO.output(led_no, True)
         return 0
      else:
         led_n1_f(led_no, t, 0.5)
         GPIO.output(led_no, False)
         return 1
   except:
      led_n1_f(led_no, t, 0.5)
      GPIO.output(led_no, False)
      return 1
def led_wait(t, s):
   n  = 0
   ts = t / (s * 2)
   while n < ts:
      GPIO.output(15, False)
      GPIO.output(11, True)
      time.sleep(s)
      GPIO.output(11, False)
      GPIO.output(13, True)
      time.sleep(s)
      GPIO.output(13, False)
      GPIO.output(15, True)
      time.sleep(s)
      n += 1
#EX:)解説:ホスト名, GPIOのPIN, 指定時間
#EX:)ping_tp(host_vpn_A, 11, 5)
#待ち時間
led_n3_f(10, 0.7)
led_wait(50, 0.25)

############################################################
while True:
   try:
      cn = 0
      while cn < 30:
         led_n1_f(15, 10, 1.5)
         GPIO.output(15, True)
         time.sleep(50)
         cn += 1
      tt1 = ping_tp(host_dns, 11, 20)
      if tt1 == 0:
         kk1 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
         if kk1 == 0:
            pass
         else:
            led_n1_f(15, 10, 0.5)
            os.system('sudo hamachi login')
            kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk2 == 0:
               pass
            else:
               led_n1_f(15, 20, 0.05)
               os.system('sudo reboot')
               sys.exit()
      else:
         tt2 = ping_tp(host_dns, 11, 20)
         if tt2 == 0:
            kk3 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
            if kk3 == 0:
               pass
            else:
               led_n1_f(15, 10, 0.5)
               os.system('sudo hamachi login')
               kk2 = ping_sb(host_vpn_A, host_vpn_B, 13, 20)
               if kk2 == 0:
                  pass
               else:
                  led_n1_f(15, 20, 0.05)
                  os.system('sudo reboot')
                  sys.exit()
         else:
            led_n1_f(15, 20, 0.05)
            os.system('sudo reboot')
            sys.exit()
   except:
      led_n3_f(1800, 0.05)
      os.system('sudo reboot')
      sys.exit()

自動起動するようにする

再起動後自動起動することによってまた監視を続行する。

$sudo vi /etc/rc.local

#最後らへんに追加 先程作ったディレクトリを選択してください。ここではusr
python /usr/local/bin/ping_monitor.py &

exit 0

以上

自動起動を止めたい場合はrc.localの追加部分をコメントアウトするか削除してください。