ラズパイで同じことをやれば

投稿日:

raspberry_pi 昨日試した「虫瞰(ちゅうかん)カメラ」、同じことをRaspberry Piでやれば、WiFi経由でストリーミング映像リアルタイム・ディストリビューション、なども可能であるな。

 ……しんどいからやらないけど。……けど、やりたいなあ。……「Media Tomb」とかRaspberry Piに入れとけば、自宅のテレビでDLNA経由で見る、とかも一気に可能だわ。

 問題は、3.3Vロジックだったりするのが扱いづらいんだよなー……。もし、昨日みたいに超音波センサなんか付けようとすると、途端にひと苦労するもんな。5Vの3端子レギュレータを別建て、センサの入力も結構一苦労して読まなくちゃならん。あと、アナログ入れるのが難しい。金をかければ、プラグインみたいなものはいくらでもあるだろうとは思うんだけど……。

虫瞰(ちゅうかん)カメラ

投稿日:

虫瞰カメラ 唐突だが、虫瞰(ちゅうかん)動画を撮りたいっ、などと思ったのである。それはTwitterのだいぶ前からのお知り合いで、クリエイターの齋藤美紀さんという方が、このところArduinoでのロボット製作を試しておられ、それに刺激を受けたということも大きい。私のほうがArduinoに関しては少しばかり先達なのだが、モーターで動くものについては齋藤さんのほうが熱心に取り組んでおられるので、まあ、インスパイアされたわけである。

 モーターで動く小さい台車にデジカメを乗せ、走り回らせて動画を撮りたい。虫の視点で動画を撮るわけだ。人の視点では思いもよらない、家の中のいろいろなものが写り込んで、面白いのではないだろうか。

 Arduinoで制御し、手持ちの超音波センサで障害物を避けるようにしたい。

 できるだけシンプルに作るため、操向装置を工夫する。普通ならサーボなどを用いて操向輪の向きを操作するのだろうが、ここを単純にしたい。

 3輪の台車にし、後輪をキャスターのようなものにする。前進時はまっすぐに向くが、後退させるとモーメントがかかって後輪が傾き、左右どちらかに振れるようにする。そうすると、前進・後退の制御のみであちらこちらに台車を走行させることができるだろう。直進していって、ある程度まで壁などの障害物に近づくと、後退させる。後退させると、左右どちらかに向きが振れるので、超音波センサで測距しつつ後退させ、ある程度障害物が離れたらまた前進させる。

 Arduinoでモーターを回すには、FETやトランジスタを用いる方法もあるが、前進・後退をさせるためには逆転ができた方がよい。それをFETなどを使ってスクラッチでやるのは面倒くさい。そこで、「モータードライバIC」を購入して、手っ取り早く済ませよう。

 検索すると、よく売れていて入手しやすく、かつ他人の作例も多そうなものには東芝のTA7291Pというのがある。メーカーのサイトには生産終了予定と出ているものの、秋葉原へ行けば多分千石電商あたりに置かれているだろう。180円とか300円とか、そんな値段なので、どうってことはない。

 このモータードライバに合うような模型用のモーターを選ぶ。スペックシートによるとTA7291Pは1A流せる。乾電池で台車を動かすとして、Arduinoには5Vがいるから、単3×4本の6Vとして、良さげなものをマブチのページで見繕う。

 6Vだと電流が途端に2.9Aくらいにハネ上がり、モータードライバに合わない。しかも、急に1000円近くするので、趣味の工作にはちょっとどうかと思う。それで、電圧は3端子レギュレータを一つ買って落とすとして、3Vのものを見繕うと、「FA-130RA」というのに結局落ち着きそうだ。このモーターはよく使われているようで、他の方の作例にも良く出てくる。電圧は3Vまで、500mAだから、TA7291Pで動かすにはぴったりだ。

 このモーターをタミヤあたりのギアボックスにうまく取り付ければいいだろう。

 ギヤボックスを探すと、モーター込みのものも多くあるようだ。見ていると、このFA-130RA込みのギヤボックスがある。「タミヤ・3速クランクギヤーボックス」というやつだ。モーター込みで600円かそこらは安い。

 最後に、ゴムの車輪を三つ、だな。まあ、これは何か、いいものがあるだろう。

 休みなので、さっそく秋葉原へ行き、いろいろと買い込んでくる。秋葉原にはないものを、帰りに北千住の東急ハンズで買う。

買い込んできたブツいろいろ
IMG_3537

 まず、タミヤの「ミニモーター標準ギヤボックス」というのを買ってみた。モーター付きだが810円。安いかと言うと微妙なところだが、自力でギヤをいろいろやるとこれが結構大変なので、まあ、値段はこんなところだろう。

ミニモーター標準ギヤボックス
IMG_3538

 それから、走行させるためのゴムタイヤを買う。向きをうまく変えるための「キャスター」は東急ハンズで買う。

タイヤとキャスター
IMG_3540

 タイヤはさておき、この「キャスター」が、今回の私の工夫だ。前進・後退のみ、モーター1個の制御で、操向もしてしまおう、という工夫だ。このキャスターの変向角度を一定に制限し、後退する時だけランダムに向きが変わるようにするのだ。

 それから東芝のモータードライバ「TA7291P」と、モーター用に電圧を落とす3端子レギュレータ。3端子レギュレータは3.3Vのものを探したが、なかったので、2.5Vのものを買った。これでだめなら、抵抗分圧で電圧を落とそう。

IMG_3541

 ギヤボックスは組み立てるとこうなる。

IMG_3543

 これを、いつもの100円ショップ「ダイソー」にあるアクリルの枠にねじ止めし、タイヤを取り付け、例のキャスターも取り付ける。

IMG_3544
IMG_3545

 このキャスターの根元に、適当な金具を共締めし、変向角度を制限してやる。

IMG_3546
IMG_3547

 これが、「モーター1個だけで向きも変える工夫」である。ためしに、2.5Vで動かしたがどうも力がなくていけない。そこで、ギア比をうんと落とし、9Vを直接モータにくれてやることにした。まあ、壊れやせんだろ。電流を測ると、200mAくらいなので、Arduinoに直接流さなければ許容範囲である。

 さて、機械のほうはこれくらいのぞんざい適当、次に電子回路のほうに取り掛かる。

 次のように考え、この通りブレッドボードを作る。

モータドライバ及び超音波センサ結線要図
虫瞰カメラ台車

 モータ付きの台車に取り付けると、次のとおりである。

IMG_3570
IMG_3569

 スケッチは次のように書く。

//
//  crawlCar.ino
//    27.10.11(日) 0600~
//    佐藤俊夫
//    台車を這いまわらせる
//

// モータードライバ
const int MOTOR1 = 7;
const int MOTOR2 = 8;
const int MOTORPWM = 6;
//  超音波センサ
const int TRIG  = 9;
const int ECHO  = 10;
//  現在の台車の状態
const unsigned int STOP = 0, FORWARD = 1, BACK = 2;
//  ストップさせる距離、前進を再開させる距離
const float FOWSTOP = 20.0, FOWCONT = 50.0;
//  ある程度はバックを持続するようバック継続時間制限(ミリ秒)
const unsigned int BACKLIMIT = 2000;
//  PWMの強さ
const unsigned int POWER = 128;

void setup(){
  pinMode(MOTOR1,OUTPUT);  //  モータードライバ入力1へ
  pinMode(MOTOR2,OUTPUT);  //  モータードライバ入力2へ
  pinMode(TRIG,OUTPUT);
  pinMode(ECHO,INPUT);
}

void loop(){
  static unsigned int state = FORWARD;
  static unsigned long int backstart = 0;
  float range = 0.0;
  
  range = ranging();
  if(range >= FOWSTOP && state != BACK){
    state = motor(FORWARD);
  }
  else if(range < FOWCONT){
    if(state == FORWARD){
      state = motor(BACK);
      backstart = millis();
    }
    else{
      if(millis() >= (backstart + BACKLIMIT)){
        state = motor(FORWARD);
      }
      else{
        state = motor(BACK);
      }
    }
  }
  else{
      if(millis() >= (backstart + BACKLIMIT)){
        state = motor(FORWARD);
      }
  }
}
//
//  モーター制御
//
unsigned int motor(unsigned int command){
  switch(command){
    case FORWARD:
      digitalWrite(MOTOR1, LOW);
      digitalWrite(MOTOR2, HIGH);
      analogWrite(MOTORPWM, POWER);
      break;
    case BACK:
      digitalWrite(MOTOR1, HIGH);
      digitalWrite(MOTOR2, LOW);
      analogWrite(MOTORPWM, POWER);
      break;
    case STOP:
      digitalWrite(MOTOR1, LOW);
      digitalWrite(MOTOR2, LOW);
      break;
    default:
      digitalWrite(MOTOR1, LOW);
      digitalWrite(MOTOR2, LOW);
      break;
  }
  return command;
}  
//
//  測距
//
float ranging(){
  float time = 0.0, range = 0.0;

  digitalWrite(TRIG,LOW);
  delayMicroseconds(1);
  digitalWrite(TRIG,HIGH);
  delayMicroseconds(1);
  digitalWrite(TRIG,LOW);
  time = pulseIn(ECHO,HIGH);
  if (time > 0) {
    range = (time / 2) * 340 * 100 / 1000000;
    return(range);
  }else{
    return(9999);
  }
}  

 これを走り回らせると、次のようになる。

 これにカメラを積み込み……

虫瞰カメラ

 で、動画を撮影するわけだ。

 なかなか這いまわっている感じが出て、いいと思う。

Raspberry Piで温度を測ろう

投稿日:

 以前、Arduinoのアナログ入力にサーミスタをつなぎ、温度計にして遊んだ最近はLCDディスプレイに温度を表示してみたり、なかなか面白い。

 一方、Raspberry PiはWebによくなじむ。ApacheもPHPも走る。

IMG_3317 それで、先週宮城大学小島研究室のサイトで公開しておられるADCアクセスのためのソースコードを拝借して遊んだが、これを使ってWeb温度計にしてみた。

 まず、ブレッドボードにAD変換ICのMCP3208と、サーミスタ、分圧用の抵抗1kΩを置き、適切に配線する。これには、以前Arduinoで遊ぶために買った「Seeedstudio Arduino Sidekick Basic Kit」に入っていたMF11-503Kというサーミスタをそのまま使う。

 それから、C++でこんなプログラムを書く。先週も書いたが、宮城大学小島研究室のサイトで公開しておられるコードは、Raspberry Pi 1では何の支障もなく動くが、Raspberry Pi 2 Model Bではそのままでは動かない。一部の型キャストなどを変更する必要がある。それについては先週のエントリで記してある。

//
//    tempMesure.cpp
//      佐藤俊夫
//      Sun Sep  6 13:57:53 JST 2015
//      サーミスタMF11-503Kと1kΩ抵抗を直列につなぎ、3.3Vを印加して、
//      その間から分圧をとって温度を測る。
//      宮城大学小島研究室でウェブ公開しておられるソースコードを拝借した。
//      コンパイル
//        cc -lm tempMesure.cpp raspSPI.o raspADC.o -o tempMesure
//
#include <stdio.h>
#include <math.h>
#include "raspADC.h"

#define ADC_CHIP  ADC_3208
float tempMesure(int srcVal);

int main() {
  ADC adc;

  adc.init("/dev/spidev0.1", ADC_CHIP);
  printf("%2.2f\n", tempMesure(adc.get(0)));
}

float tempMesure(int srcVal){
  const float B = 4350.0, Ta = 25.0, Rt0 = 50000.0;  //  MF11-503Kスペックシート記載
  const float K = 273.15;  //  熱力学温度の定数
  const float v0 = 3.3, r0 = 1000.0;  //  Arduino +5Vと電流調整抵抗1kΩ
  const int resolution = 4096;  //  アナログ入力の分解能
  float vt = 0.0, rt = 0.0;

  vt = srcVal * (v0 / (resolution - 1));
  rt = (v0 * r0 - vt * r0) / vt;
  return(1.0 / (log(rt / Rt0) / B + 1.0 / (Ta + K)) - K);
}

 これは単に、サーミスタで計った現在の温度を標準出力に書くだけだ。

 これを「popen();」で開けば、PHPで読める。簡単である。

<html>
 <head>
  <meta name="Editor" content="vim">
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <link rel="icon" href="favicon.ico" type="image/x-icon" />
  <link rel="Shortcut Icon" type="image/x-icon" href="favicon.ico" />
  <title>PHPで温度計</title>
  <meta http-equiv="Keyword" content="佐藤俊夫, 佐藤, 俊夫, SATOTOSHIO, SatoToshio, sato, toshio, Raspberry Pi, Raspberry Pi 2 Model B">
 </head>
 <body bgcolor="#888888">
<body>
  <center>
  <h1><img src="raspberry_pi.png" width="50px" align="middle"/>Raspberry Pi + PHPで温度計</h1>
  <hr>
  </center>
<?
ini_set( 'display_errors', 1 );
$process = popen("sudo /home/toshio/SPI_ADC/tempMesure", "r");
$temp = fgets($process);
?>
<center>
<table border=1 width="120px">
<tr> <th>0</th><th>10</th> <th>20</th> <th>30</th> <th>40</th> <th>50</th> <th>60</th></tr>
<tr><td colspan = 7>
<table>
<tr>
<td bgcolor="red" width="<?print $temp * 2?>px"><?print $temp?>℃</td&t;</tr></table>
</tr>
</table>
</td></tr></tr></table>
</center>
</body>
</html>

raspberry_tempMesure
 テーブルの幅を温度計のアルコール柱に見立てて、赤い帯で表すようにしてみた。


 Arduinoでも同じようなことはできるが、Arduinoで難しいのは、こういうふうに、無駄に画像を配置したり、少し分量の多いHTMLを書いたりすることだ。だが、こんなことはRaspberry Piには造作もなくできてしまう。

 反面、Arduinoはアナログ入力が直接可能だが、Raspberry Piで同じことをしようとすると、アナログ入力にAD変換ICを準備し、これとの通信にもいろいろと研究の上で取り組む必要がある。簡単で刺激的な目的のために少しプロトタイピングをしてみようと考えている多くのクリエイターがなしうるところではない。

 入門書籍「Raspberry Piをはじめよう」にもそうしたことが少し書かれてある。

そうか、PHPでもモノにつながるな

投稿日:

raspi_index Raspberry Piは要するにLinuxマシンなので、ウェブサーバも選り取り見取りだ。単にウェブインターフェイスを備えたモノのプロトをするならArduinoのほうが手っ取り早いが、いかんせん、リッチなウェブ・コンテンツをArduino+ETHERNET SHIELD 2でサービスするのは難しく、不可能ではないにもせよ、ウェブ・コンテンツに写真を置くなどというのはほとんど無理であった。

 Raspberry Piはコンピュータ・パワーが大きいから、大きなウェブ・コンテンツも本体内に飲み込んでしまえる。

 そこで、である。Raspberry Piで遊ぶのに、なにも世間の教科書通りにPythonやRubyの作例を打ち込むだけが能ではない。CだってC++だって、PerlだってPHPだって動くはずである。SMTPもPOPもNTPも、なんだって動く。多分MySQLだのPostgreSQLだのも動くだろう。

 Apacheをインストールして動かしてみよう。それから、PHPでGPIOを突っついてみよう。これは、PHPでハードウェアを動かすことにつながる。無駄に贅沢なWebインターフェイスでLチカ、というのも面白い。

Apacheのインストールに先立ち、今動いているサービスを確かめよう

 まず、今起動しているモノを確認してみよう。RedHat系のLinux、Fedoraなどはこういう時に「chkconfig –list」などとするが、Raspberry Piに入っているのは「Raspbian」だ。RaspbianはDebian系のディストリビューションなので、chkconfigはない。

 私はUNIX育ちのオッサンで、SVR4.2の管理人を長年やっきた。Linuxに関してはフリー時代のRedHat(4~9ぐらいまで)、それ以降はずっとFedora Coreを使ってきたので、Debianは良く知らないのである。ま、これも機会だから、ちょっと体験してみようではないの。

 ネット情報によると「insserv」「update-rc.d」「sysv-rc-conf」「rcconf」「upstart」などがあるという。

# insserv -s
K:01:0 1 6:triggerhappy
K:07:0 6:umountfs
K:04:0 6:umountnfs.sh
K:02:0 6:sendsigs
K:01:0 6:plymouth
K:03:0 1 6:rsyslog
K:06:0 6 S:hwclock.sh
K:01:0 1 6:alsa-utils
K:06:0 6:networking
K:05:0 1 2 3 4 5 6 S:rpcbind
K:05:0 1 2 3 4 5 6 S:nfs-common
K:01:0 6:urandom
K:01:0 1 6:avahi-daemon
K:01:0 1 6:dhcpcd
K:01:0 1 6:cgroup-bin
K:08:0 6:umountroot
K:09:0:halt
K:09:6:reboot
K:01:0 1 6:fake-hwclock
K:01:0 1 2 6:lightdm
K:01:0 1 6:ifplugd
S:02:S:udev
S:03:S:keyboard-setup
S:15:S:console-setup
S:01:2 3 4 5:triggerhappy
S:08:S:mountall.sh
S:09:S:mountall-bootclean.sh
S:12:S:mountnfs.sh
S:13:S:mountnfs-bootclean.sh
S:04:2 3 4 5:plymouth
S:01:2 3 4 5:rsyslog
S:16:S:alsa-utils
S:11:S:networking
S:10:S:urandom
S:04:S:mountdevsubfs.sh
S:05:S:checkroot.sh
S:03:2 3 4 5:avahi-daemon
S:02:2 3 4 5:dbus
S:01:2 3 4 5:dhcpcd
S:01:2 3 4 5:cgroup-bin
S:01:S:mountkernfs.sh
S:01:S:fake-hwclock
S:03:3 4 5:lightdm
S:16:S:x11-common
S:14:S:kbd
S:01:2 3 4 5:ifplugd
S:02:1:single
S:01:1:killprocs
S:01:1 2 3 4 5:bootlogs
S:01:S:hostname.sh
S:01:1 2 3 4 5:motd
S:02:2 3 4 5:dphys-swapfile
S:04:2 3 4 5:rc.local
S:04:2 3 4 5:rmnologin
S:02:2 3 4 5:cron
S:02:2 3 4 5:rsync
S:02:2 3 4 5:ssh
S:02:2 3 4 5:ntp
S:01:2 3 4 5:sudo
S:16:S:raspi-config
S:10:S:udev-mtab
S:06:S:checkroot-bootclean.sh
S:16:S:bootmisc.sh
S:06:S:kmod
S:16:S:plymouth-log
S:07:S:checkfs.sh
S:06:S:mtab.sh
S:10:S:procps

 ほほー、なるほど、コレは多分、左から現状(StartかKillか)、起動順、起動すべきRun-Levelのリスト、サービス名、だろうなあ。はて、S、Kじゃないほうの、Run-Levelの「S」は、なんだろ、と調べると、「起動順で一番はじめ、かつ、どのRun-Levelでも共通で起動」ということのようである。

 で、

# insserv -s | egrep '(pache)|(ttp)'
#

 なんてことをやっても、全然何も出ないから、デフォルトのRaspbianではhttpらしきものやApacheらしきものは何も動いていない。

Apacheをインストール

 それでは、というわけで、

# apt-get -s install apache2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
提案パッケージ:
  apache2-doc apache2-suexec apache2-suexec-custom openssl-blacklist
以下のパッケージが新たにインストールされます:
  apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1
  libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
アップグレード: 0 個、新規インストール: 10 個、削除: 0 個、保留: 0 個。
Inst libapr1 (1.4.6-3+deb7u1 Raspbian:7.0/oldstable [armhf])
Inst libaprutil1 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Inst libaprutil1-dbd-sqlite3 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Inst libaprutil1-ldap (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Inst apache2.2-bin (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2-utils (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2.2-common (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2-mpm-worker (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst apache2 (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst ssl-cert (1.0.32 Raspbian:7.0/oldstable [all])
Conf libapr1 (1.4.6-3+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf libaprutil1 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Conf libaprutil1-dbd-sqlite3 (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Conf libaprutil1-ldap (1.4.1-3 Raspbian:7.0/oldstable [armhf])
Conf apache2.2-bin (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2-utils (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2.2-common (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2-mpm-worker (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2 (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf ssl-cert (1.0.32 Raspbian:7.0/oldstable [all])
#

 特に問題なさそうだな、というわけで……

# apt-get install apache2
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1
  libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
提案パッケージ:
  apache2-doc apache2-suexec apache2-suexec-custom openssl-blacklist
以下のパッケージが新たにインストールされます:
  apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1
  libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap ssl-cert
アップグレード: 0 個、新規インストール: 10 個、削除: 0 個、保留: 0 個。
1,356 kB のアーカイブを取得する必要があります。
この操作後に追加で 4,585 kB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libapr1 armhf 1.4.6-3+deb7u1 [90.9 kB]
取得:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libaprutil1 armhf 1.4.1-3 [77.1 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libaprutil1-dbd-sqlite3 armhf 1.4.1-3 [17.2 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libaprutil1-ldap armhf 1.4.1-3 [16.0 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2.2-bin armhf 2.2.22-13+deb7u6 [676 kB]
取得:6 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-utils armhf 2.2.22-13+deb7u6 [163 kB]
取得:7 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2.2-common armhf 2.2.22-13+deb7u6 [292 kB]
取得:8 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-mpm-worker armhf 2.2.22-13+deb7u6 [2,238 B]
取得:9 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2 armhf 2.2.22-13+deb7u6 [1,440 B]
取得:10 http://mirrordirector.raspbian.org/raspbian/ wheezy/main ssl-cert all 1.0.32 [19.5 kB]
1,356 kB を 4秒 で取得しました (281 kB/s)
パッケージを事前設定しています ...
以前に未選択のパッケージ libapr1 を選択しています。
(データベースを読み込んでいます ... 現在 78616 個のファイルとディレクトリがインストールされています。)
(.../libapr1_1.4.6-3+deb7u1_armhf.deb から) libapr1 を展開しています...
以前に未選択のパッケージ libaprutil1 を選択しています。
(.../libaprutil1_1.4.1-3_armhf.deb から) libaprutil1 を展開しています...
以前に未選択のパッケージ libaprutil1-dbd-sqlite3 を選択しています。
(.../libaprutil1-dbd-sqlite3_1.4.1-3_armhf.deb から) libaprutil1-dbd-sqlite3 を展開しています...
以前に未選択のパッケージ libaprutil1-ldap を選択しています。
(.../libaprutil1-ldap_1.4.1-3_armhf.deb から) libaprutil1-ldap を展開しています...
以前に未選択のパッケージ apache2.2-bin を選択しています。
(.../apache2.2-bin_2.2.22-13+deb7u6_armhf.deb から) apache2.2-bin を展開しています...
以前に未選択のパッケージ apache2-utils を選択しています。
(.../apache2-utils_2.2.22-13+deb7u6_armhf.deb から) apache2-utils を展開しています...
以前に未選択のパッケージ apache2.2-common を選択しています。
(.../apache2.2-common_2.2.22-13+deb7u6_armhf.deb から) apache2.2-common を展開しています...
以前に未選択のパッケージ apache2-mpm-worker を選択しています。
(.../apache2-mpm-worker_2.2.22-13+deb7u6_armhf.deb から) apache2-mpm-worker を展開していま す...
以前に未選択のパッケージ apache2 を選択しています。
(.../apache2_2.2.22-13+deb7u6_armhf.deb から) apache2 を展開しています...
以前に未選択のパッケージ ssl-cert を選択しています。
(.../ssl-cert_1.0.32_all.deb から) ssl-cert を展開しています...
man-db のトリガを処理しています ...
libapr1 (1.4.6-3+deb7u1) を設定しています ...
libaprutil1 (1.4.1-3) を設定しています ...
libaprutil1-dbd-sqlite3 (1.4.1-3) を設定しています ...
libaprutil1-ldap (1.4.1-3) を設定しています ...
apache2.2-bin (2.2.22-13+deb7u6) を設定しています ...
apache2-utils (2.2.22-13+deb7u6) を設定しています ...
apache2.2-common (2.2.22-13+deb7u6) を設定しています ...
Enabling site default.
Enabling module alias.
Enabling module autoindex.
Enabling module dir.
Enabling module env.
Enabling module mime.
Enabling module negotiation.
Enabling module setenvif.
Enabling module status.
Enabling module auth_basic.
Enabling module deflate.
Enabling module authz_default.
Enabling module authz_user.
Enabling module authz_groupfile.
Enabling module authn_file.
Enabling module authz_host.
Enabling module reqtimeout.
apache2-mpm-worker (2.2.22-13+deb7u6) を設定しています ...
[....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
apache2 (2.2.22-13+deb7u6) を設定しています ...
ssl-cert (1.0.32) を設定しています ...
#

 なんてことなく終わる。

Apacheの起動状況を確かめる

 次に、

# insserv -s | egrep '(pache)|(ttp)'
K:01:0 1 6:apache2
S:02:2 3 4 5:apache2
#

……ぬぅ、StartなのかKillなのか、どっちやねん、というわけで、ブラウザにアドレスを入れてみると、

raspi-apache2start

……と、普通にApacheは動いている。KとS両方出るのは、起動順が01、02となっていることから、Run-Level 0、1、6ではどうあろうと強制終了し、改めて2、3、4、5では起動、ということであろうか。

 えーっと、自動起動のほうはこれでいいから、サービスの起動停止のテストは……、と。

# /etc/init.d/apache2 stop
[....] Stopping web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
[ ok waiting ..
root@satoraspi:~# /etc/init.d/apache2 start
[....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
#

 ふむ、だいだい動いとる。

ドキュメントルートのindex.htmlを作る

 とりあえず、indexだけ、かっこよくしておこう。えーっと、ドキュメントルートはどこかいな、と。

# ls -Fla /etc/ | egrep '(http)|(apache)'
drwxr-xr-x   7 root root    4096  8月 30 09:01 apache2/
root@satoraspi:~# ls /etc/apache2
apache2.conf  envvars  mods-available  ports.conf       sites-enabled
conf.d        magic    mods-enabled    sites-available
# cd /etc/apache2
# grep 'DocumentRoot' */*
sites-available/default:        DocumentRoot /var/www
sites-available/default-ssl:    DocumentRoot /var/www
sites-enabled/000-default:      DocumentRoot /var/www

 ……と、いうわけで普通に「/var/www」の下じゃのう。普通のユーザに戻って、

toshio@satoraspi:~$ cd /var/www
toshio@satoraspi:/var/www$ ls -Fla
合計 12
drwxr-xr-x  2 root root 4096  8月 30 09:01 ./
drwxr-xr-x 12 root root 4096  8月 30 09:01 ../
-rw-r--r--  1 root root  177  8月 30 09:01 index.html
toshio@satoraspi:/var/www$ cat index.html
<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>toshio@satoraspi:/var/www$

 はあ、さっきブラウザに出てたヤツでんな、と。

 一応残しておいて……

toshio@satoraspi:/var/www$ sudo cp index.html .index.html.ORG
[sudo] password for toshio:
toshio@satoraspi:/var/www$ sudo chown toshio:pi index.html
toshio@satoraspi:/var/www$ ls -Fla
合計 16
drwxr-xr-x  2 root   root 4096  8月 30 09:37 ./
drwxr-xr-x 12 root   root 4096  8月 30 09:01 ../
-rw-r--r--  1 root   root  177  8月 30 09:37 .index.html.ORG
-rw-r--r--  1 toshio pi    177  8月 30 09:01 index.html
toshio@satoraspi:/var/www$cd ..
toshio@satoraspi:/var$sudo chown toshio:pi www
toshio@satoraspi:/var$cd www
toshio@satoraspi:/var/www$vi index.html

 んで、ばーっ、って、書くですよ。

<html>
 <head>
  <meta name="Editor" content="vim">
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <link rel="icon" href="favicon.ico" type="image/x-icon" />
  <link rel="Shortcut Icon" type="image/x-icon" href="favicon.ico" />
  <title>おっさん用Raspberry Pi 2 Model B</title>
  <meta http-equiv="Keyword" content="佐藤俊夫, 佐藤, 俊夫, SATOTOSHIO, SatoToshio, sato, toshio, Raspberry Pi, Raspberry Pi 2 Model B">
 </head>
 <body bgcolor="#888888">
  <basefont size=4">
  <center>
  <table>
  <tr>
  <td>
    <h1>おっさん用Raspberry Pi 2 Model B</h1>
    <hr>
    <center><img src="raspberry_pi.png"></center>
  </td>
  </tr>
  <tr>
  <td>
    とりあえずまだ何もない。
  </td>
  </tr>
 </table>
 </center>
 </body>
</html>

 んで、画像なんかをSCPでコピーして、まずはこんなindex.htmlですな。

raspi_index

 それにしても、こんな、5千円かそこらのシングルボードでapache2のウェブサービスができるなんて、隔世の感があるな。

同じようにして、PHPをインストール

 さておき、続いてPHPを入れよう。

toshio@satoraspi:/var/www$ cd
toshio@satoraspi:~$ su -
パスワード:
root@satoraspi:~# apt-cache search php5
dwoo - PHP5 template engine
libapache2-mod-php5 - server-side, HTML-embedded scripting language (Apache 2 module)
libapache2-mod-php5filter - server-side, HTML-embedded scripting language (apache 2 filter module)
libexpect-php5 - expect module for PHP 5
libgv-php5 - PHP5 bindings for graphviz
libkohana2-modules-php - lightweight PHP5 MVC framework (extension modules)
libkohana2-php - lightweight PHP5 MVC framework
libkohana3.1-core-php - PHP5 framework core classes
libkohana3.1-php - PHP5 framework metapackage
libkohana3.2-core-php - PHP5 framework core classes
libkohana3.2-php - PHP5 framework metapackage
libow-php5 - Dallas 1-wire support: PHP5 bindings
libphp-jpgraph - Object oriented graph library for php5
libphp-jpgraph-examples - Object oriented graph library for php5 (examples)
libphp5-embed - HTML-embedded scripting language (Embedded SAPI library)
php-doc - Documentation for PHP5
php-imlib - PHP Imlib2 Extension
php5 - server-side, HTML-embedded scripting language (metapackage)
php5-adodb - Extension optimising the ADOdb database abstraction library
php5-cgi - server-side, HTML-embedded scripting language (CGI binary)
php5-cli - command-line interpreter for the php5 scripting language
php5-common - Common files for packages built from the php5 source
php5-curl - CURL module for php5
php5-dbg - Debug symbols for PHP5
php5-dev - Files for PHP5 module development
php5-enchant - Enchant module for php5
php5-exactimage - fast image manipulation library (PHP bindings)
php5-ffmpeg - audio and video support via ffmpeg for php5
php5-fpm - server-side, HTML-embedded scripting language (FPM-CGI binary)
php5-gd - GD module for php5
php5-gdcm - Grassroots DICOM PHP5 bindings
php5-geoip - GeoIP module for php5
php5-gmp - GMP module for php5
php5-imagick - ImageMagick module for php5
php5-imap - IMAP module for php5
php5-interbase - interbase/firebird module for php5
php5-intl - internationalisation module for php5
php5-lasso - Library for Liberty Alliance and SAML protocols - PHP 5 bindings
php5-ldap - LDAP module for php5
php5-librdf - PHP5 language bindings for the Redland RDF library
php5-mapscript - php5-cgi module for MapServer
php5-mcrypt - MCrypt module for php5
php5-memcache - memcache extension module for PHP5
php5-memcached - memcached extension module for PHP5, uses libmemcached
php5-midgard2 - Midgard2 Content Repository - PHP5 language bindings and module
php5-ming - Ming module for php5
php5-mysql - MySQL module for php5
php5-mysqlnd - MySQL module for php5 (Native Driver)
php5-odbc - ODBC module for php5
php5-pgsql - PostgreSQL module for php5
php5-ps - ps module for PHP 5
php5-pspell - pspell module for php5
php5-radius - PECL radius module for PHP 5
php5-recode - recode module for php5
php5-remctl - PECL module for Kerberos-authenticated command execution
php5-rrd - rrd module for PHP 5
php5-sasl - Cyrus SASL extension for PHP 5
php5-snmp - SNMP module for php5
php5-sqlite - SQLite module for php5
php5-svn - PHP Bindings for the Subversion Revision control system
php5-sybase - Sybase / MS SQL Server module for php5
php5-tidy - tidy module for php5
php5-tokyo-tyrant - PHP interface to Tokyo Cabinet's network interface, Tokyo Tyrant
php5-vtkgdcm - Grassroots DICOM VTK PHP bindings
php5-xcache - Fast, stable PHP opcode cacher
php5-xdebug - Xdebug Module for PHP 5
php5-xmlrpc - XML-RPC module for php5
php5-xsl - XSL module for php5
phpunit - Unit testing suite for PHP5
root@satoraspi:~#

 はあ、いっぱい出たけど、要するにPHP5があるんだよな。うん、うん。

root@satoraspi:~# apt-get -s install php5
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5-cli php5-common
提案パッケージ:
  php-pear
以下のパッケージは「削除」されます:
  apache2-mpm-worker
以下のパッケージが新たにインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5 php5-cli
  php5-common
アップグレード: 0 個、新規インストール: 8 個、削除: 1 個、保留: 0 個。
Remv apache2-mpm-worker [2.2.22-13+deb7u6] [apache2:armhf ]
Inst apache2-mpm-prefork (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Conf apache2-mpm-prefork (2.2.22-13+deb7u6 Raspbian:7.0/oldstable [armhf])
Inst lsof (4.86+dfsg-1 Raspbian:7.0/oldstable [armhf])
Inst php5-common (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Inst libonig2 (5.9.1-1 Raspbian:7.0/oldstable [armhf])
Inst libqdbm14 (1.8.78-2 Raspbian:7.0/oldstable [armhf])
Inst libapache2-mod-php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Inst php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [all])
Inst php5-cli (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf lsof (4.86+dfsg-1 Raspbian:7.0/oldstable [armhf])
Conf php5-common (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf libonig2 (5.9.1-1 Raspbian:7.0/oldstable [armhf])
Conf libqdbm14 (1.8.78-2 Raspbian:7.0/oldstable [armhf])
Conf libapache2-mod-php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
Conf php5 (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [all])
Conf php5-cli (5.4.44-0+deb7u1 Raspbian:7.0/oldstable [armhf])
root@satoraspi:~#

 入れても大丈夫みたいだ。

root@satoraspi:~# apt-get  install php5
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5-cli php5-common
提案パッケージ:
  php-pear
以下のパッケージは「削除」されます:
  apache2-mpm-worker
以下のパッケージが新たにインストールされます:
  apache2-mpm-prefork libapache2-mod-php5 libonig2 libqdbm14 lsof php5 php5-cli
  php5-common
アップグレード: 0 個、新規インストール: 8 個、削除: 1 個、保留: 0 個。
6,142 kB のアーカイブを取得する必要があります。
この操作後に追加で 17.3 MB のディスク容量が消費されます。
続行しますか [Y/n]? y
取得:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main apache2-mpm-prefork armhf 2.2.22-13+deb7u6 [2,342 B]
取得:2 http://mirrordirector.raspbian.org/raspbian/ wheezy/main lsof armhf 4.86+dfsg-1 [321 kB]
取得:3 http://mirrordirector.raspbian.org/raspbian/ wheezy/main php5-common armhf 5.4.44-0+deb7u1 [621 kB]
取得:4 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libonig2 armhf 5.9.1-1 [130 kB]
取得:5 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libqdbm14 armhf 1.8.78-2 [119 kB]
取得:6 http://mirrordirector.raspbian.org/raspbian/ wheezy/main libapache2-mod-php5 armhf 5.4.44-0+deb7u1 [2,479 kB]
取得:7 http://mirrordirector.raspbian.org/raspbian/ wheezy/main php5 all 5.4.44-0+deb7u1 [1,024 B]
取得:8 http://mirrordirector.raspbian.org/raspbian/ wheezy/main php5-cli armhf 5.4.44-0+deb7u1 [2,469 kB]
6,142 kB を 6秒 で取得しました (1,016 kB/s)
dpkg: apache2-mpm-worker: 依存関係に問題があります。しかし要求に従い削除しています:
 apache2 は以下に依存 (depends) します: apache2-mpm-worker (= 2.2.22-13+deb7u6) | apache2-mpm-prefork (= 2.2.22-13+deb7u6) | apache2-mpm-event (= 2.2.22-13+deb7u6) | apache2-mpm-itk (= 2.2.22-13+deb7u6) ...しかし:
  パッケージ apache2-mpm-worker は削除されようとしています。
  パッケージ apache2-mpm-prefork はまだインストールされていません。
  パッケージ apache2-mpm-event はまだインストールされていません。
  パッケージ apache2-mpm-itk はまだインストールされていません。

(データベースを読み込んでいます ... 現在 79208 個のファイルとディレクトリがインストールされています。)
apache2-mpm-worker を削除しています ...
[....] Stopping web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
[ ok waiting ..
以前に未選択のパッケージ apache2-mpm-prefork を選択しています。
(データベースを読み込んでいます ... 現在 79203 個のファイルとディレクトリがインストールされています。)
(.../apache2-mpm-prefork_2.2.22-13+deb7u6_armhf.deb から) apache2-mpm-prefork を展開してい ます...
apache2-mpm-prefork (2.2.22-13+deb7u6) を設定しています ...
[....] Starting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
以前に未選択のパッケージ lsof を選択しています。
(データベースを読み込んでいます ... 現在 79208 個のファイルとディレクトリがインストールされています。)
(.../lsof_4.86+dfsg-1_armhf.deb から) lsof を展開しています...
以前に未選択のパッケージ php5-common を選択しています。
(.../php5-common_5.4.44-0+deb7u1_armhf.deb から) php5-common を展開しています...
以前に未選択のパッケージ libonig2 を選択しています。
(.../libonig2_5.9.1-1_armhf.deb から) libonig2 を展開しています...
以前に未選択のパッケージ libqdbm14 を選択しています。
(.../libqdbm14_1.8.78-2_armhf.deb から) libqdbm14 を展開しています...
以前に未選択のパッケージ libapache2-mod-php5 を選択しています。
(.../libapache2-mod-php5_5.4.44-0+deb7u1_armhf.deb から) libapache2-mod-php5 を展開しています...
以前に未選択のパッケージ php5 を選択しています。
(.../php5_5.4.44-0+deb7u1_all.deb から) php5 を展開しています...
以前に未選択のパッケージ php5-cli を選択しています。
(.../php5-cli_5.4.44-0+deb7u1_armhf.deb から) php5-cli を展開しています...
man-db のトリガを処理しています ...
lsof (4.86+dfsg-1) を設定しています ...
php5-common (5.4.44-0+deb7u1) を設定しています ...

Creating config file /etc/php5/mods-available/pdo.ini with new version
libonig2 (5.9.1-1) を設定しています ...
libqdbm14 (1.8.78-2) を設定しています ...
libapache2-mod-php5 (5.4.44-0+deb7u1) を設定しています ...

Creating config file /etc/php5/apache2/php.ini with new version
[....] Restarting web server: apache2apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
 ... waiting apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName
. ok
php5 (5.4.44-0+deb7u1) を設定しています ...
php5-cli (5.4.44-0+deb7u1) を設定しています ...

Creating config file /etc/php5/cli/php.ini with new version
update-alternatives: /usr/bin/php (php) を提供するために 自動モード で /usr/bin/php5 を使います
root@satoraspi:~#

……と、いうわけで、サクッと入る。

PHPの作動を確かめる

 それでは早速……。

root@satoraspi:/var/www# ログアウト
toshio@satoraspi:~$ cd /var/www
toshio@satoraspi:/var/www$ vi infotest.php

 で、中身はこじんまりとこう書いて……

<html>
<head></head>
<body>
<?phpinfo();?>
</body>
</html>

 早速ブラウザで見ると……

raspi-phpinfo

うん。動いちょる動いちょる。

さっそくPHPでLチカ

 さて、次に、phpからGPIOだな。マンネリだけどやっぱり「Lチカ」か。

「web2LED.php」

<html>
 <head>
  <meta name="Editor" content="vim">
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
  <link rel="icon" href="favicon.ico" type="image/x-icon" />
  <link rel="Shortcut Icon" type="image/x-icon" href="favicon.ico" />
  <title>PHPでLチカ</title>
  <meta http-equiv="Keyword" content="佐藤俊夫, 佐藤, 俊夫, SATOTOSHIO, SatoToshio, sato, toshio, Raspberry Pi, Raspberry Pi 2 Model B">
 </head>
 <body bgcolor="#888888">
<body>
  <center>
  <h1>PHPでLチカ</h1>
  <hr>
  <form method="POST">
  <input type="submit" name="on"  value="LED on"><br>
  <input type="submit" name="off" value="LED off">
  </form>
  </center>
<?
ini_set( 'display_errors', 1 );
file_put_contents('/sys/class/gpio/export', 17);
file_put_contents('/sys/class/gpio/gpio17/direction', 'out');
if(isset($_POST['on'])){
  file_put_contents('/sys/class/gpio/gpio17/value', 1);
  print("LED ON.");
}elseif(isset($_POST['off'])){
  file_put_contents('/sys/class/gpio/gpio17/value', 0);
  print("LED OFF.");
}
file_put_contents('/sys/class/gpio/unexport', 17);
?>
</body>
</html>

 ブレッドボードにLEDと330Ωの抵抗を直列につけて、17番ピンとアースにつなぐ。

IMG_3313

 で、こういうフォームになるのだが……

web2LED_permission_deny

 いや、そりゃまあ、動くわけないわな、GPIOはrootでなきゃ読み書きできんのだから。

GPIOのパーミションの調整

 えーっと、どうやったらいいかな、ということで、

  • 「sudoする」
  • 「GPIOのアクセス権をヌルくする」
  • 「PHPの実行ユーザを強くする」
  • 「何かをSUID」

……などと、いろいろあるが、どうも、どれもいまいち、ピンと来ないな……。

 まあ、GPIOのアクセスをヌルくする、これかなあ……。

toshio@satoraspi:~$ cd /sys/class
toshio@satoraspi:/sys/class$ su
パスワード:
root@satoraspi:/sys/class# chmod -R 777 gpio
root@satoraspi:/sys/class# ls -Flad gpio
drwxrwxrwx 2 root gpio 0  8月 30 13:20 gpio/
root@satoraspi:/sys/class#

 なんっか、もう、力いっぱい777丸出しですけどね(笑)。多分、700とか760でも大丈夫じゃないかなあ。試してないけど。

 で、まあ、これで、フォームをクリックするとLEDが点いたり消えたりする。

Raspberry Pi + Apache + PHP + SSRでAC100Vの家電製品を制御

 これをそのまま、いつぞやArduinoでやったSSR(ソリッド・ステート・リレー)につなぐと、家電製品のオン・オフなどができるわけだ。

SSRモジュール
IMG_3047

 では、やってみよう。

Raspberry Pi 2で扇風機のオン・オフ

 真ん中の黒い箱がSSRだ。Arduinoは5V、Raspberry Pi 2は3.3Vで電圧が違うが、このSSRは3Vから8Vまでの入力を受け付けるので、大丈夫なのである。

壊れちゃった

投稿日:

 先日作成した「ピアノでLチカ」の、光り方のダイナミックレンジと言うか、そういうのが小さいので、もっと多段階に光らせられないものかな、と思った。

 そもそも、5V/10ビット=1024段のAD変換器にせいぜい4ビット分くらいの入力しかしていないのだから、これを12ビット分4096に展開したって、光り方に濃淡が足りないのは当たり前である。

 これは適切なアンプを使っていないからだというのは自明だ。

 そこで、今朝、フリップフロップ遊びをするために使ったトランジスタ、「2SC1815」に目が向く。うんうん、これで1石増幅してやろう。

 普通はこの場面ではオペアンプとかリニアICを買いに行くのだろうが、何しろ150円で10個も入っていた2SC1815がもったいない。活用しなければ。

 えーっと、どうやるんだっけな、と思い出し思い出し、ブレッドボードを作る。

 抵抗分圧でベースにバイアスをかける。エミッタにつなぐ抵抗に増幅したい倍率をかけ、それをコレクタにつなぐ。普通は直流成分カットのためのコンデンサを出力につなぐが、0~5VまでのArduinoのアナログ入力に入れるのだから、これはいらない。

 結局、ベースバイアスには220kΩ×2個、コレクタに10kΩ、エミッタに1kΩをつけた。望ましい抵抗値は他にあると思うのだが、なにしろ、手持ちのものがそれしかない。

粗製1石アンプ
2SC1815アンプ

 いやまあ、お詳しい方からすると、各種の数値がツッコミどころ満載なのでしょうが、いや、その、手元にある抵抗等がこんなのしかなかったんですよ(苦笑)。

IMG_3305

 小さいスピーカーをつないで音を聴いてみると、耳がおかしくなるくらい音が歪んでいるが(笑)、レベルは十分であるようだ。

 こんなスケッチを書き、PCのヘッドホン端子にArduinoをつないでレベルをチェックする。

#include <stdio.h>
void setup() {
  Serial.begin(9600);
  pinMode(0, INPUT);
}

void loop() {
  String graph = "";
  char s[30];
  int v = analogRead(0);
  sprintf(s, "%4d ", v);
  graph.concat(s);
  for(int i = 0; i <= v / 10; i++){
    graph.concat("*");
  }
  Serial.println(graph);
}

 音声を直接Arduinoに入れるとこんなものだが……

音声直接入力の場合
増幅前

「2SC1815」を1個通しただけで、うんと幅広になる。

2SC1815で増幅して入力した場合
増幅後

……というわけで、うまく幅広な入力が得られるようになった。

 で、入力はこれでOKだ、というわけで、それを「ピアノLチカ」につないでみたのだが、あれ……?

 3端子レギュレータが触れないくらい熱くなっている。いかんいかん、というのですぐ電源を外す。回路にどこか間違いがあるのかな、と小一時間調べたが、間違いはない。

 どうやらLEDドライブICのTLC5940NTがダメになってしまったみたいだ。いつもArduinoを保護するために、TLCには3端子レギュレータで5Vの別建て電源を作り、それを与えていたのだが、ネットの情報によると、それでTLCが不安定な状態の時に電源が通り、壊れてしまうことはよくあることらしい。

 うーん、390円、もったいないなあ……。まあ、また買いに行くとするか……。ピアノLチカは、また今度だな……。

そういえば、と

投稿日:

 そういえばまだアレをやっていなかったな、と思いつく。

 まだやっていなかったな、というのは正確ではない。やるのは30年ぶりくらいかな、というと正確だ。

 アレ、というのは「マルチバイブレータ」という回路のことだ。

 そう、この「マルチバイブレータ」という回路ををもとに少しづつカスタマイズを進めていくと「2安定マルチバイブレータ」、つまり「フリップフロップ」になり、それはそのまま1ビット記憶素子となり、やがてコンピュータそのものにつながっていくのである。

 その原点の、「マルチバイブレータ」というのは下のような回路である。

一般的な非安定マルチバイブレータの回路図
非安定マルチバイブレータ

 私などは若い頃、職場でこの回路を随分と叩き込まれたもので、当時は二つのトランジスタのところが真空管になっている回路がさまざまな機材の中にまだ現役で存在した。真空管でマルチバイブレータを構成する場合はヒータ回路などを一緒に考えなくてはならないことや、電圧が高いことなどで、実際に作動させるにはもう少し複雑な配慮が必要になる。その点、トランジスタで構成すると電力も少なくてすみ、単純明瞭だ。

 回路自体の知財権等がどうなっているか、ということを今日まで知らなかったが、今ネットで少し検索してみると、Wikipediaには「イギリス人の物理学者ウィリアム・エックルスフランク・ジョーダンによって1919年に作られた」とある。ウィリアム・エックルスは1966年に亡くなっているが、フランク・ジョーダンの没年は不明である。電子回路の知財権に関して、著作権はあいまいでよくわからないが、回路配置利用権については、日本では申請登録が必要で、かつ登録後10年となっている。要するにマルチバイブレータの回路図をネットでコピーしたり利用したりする場合の知財権関係の問題点は、回路配置利用権については申請されていないから存在しないが、著作権についてははっきりせず、よくわからないということである。しかし、マルチバイブレータの回路図は、あらゆる教科書に作成者の紹介もなく掲載されているので、多分ネットに書いても大丈夫なのではなかろうか。

 さておき、この回路の動作原理は複雑で、理解するのは困難だが、動作結果や回路自体はご覧のように簡単なので、すぐに覚えてしまえる。すなわち、一方のトランジスタのベースをもう一方のトランジスタのコレクタにコンデンサをはさんで「たすき掛け」に接続し、それぞれの接続点に抵抗を全部で4つつなぎ、これを介して電源電圧を加え、最後にエミッタを接地する……、というふうに覚えるのだ。

 発振周期の計算は私は恥ずかしながら覚えていない。しかし、ネットを漁ると、

f=\cfrac{1}{T}=\cfrac{1}{ln(2)\cdot(R_2 C_1+R_3 C_2)}\fallingdotseq\cfrac{1}{0.69315\cdot (R_2 C_1+R_3 C_2)}

……と、すぐにその式は出てくる。つまり、コンデンサふたつと、真ん中の抵抗ふたつで周期が決まる。両側の抵抗ふたつはトランジスタに流す電流を決めると思えばよい。この両側二つの抵抗をLEDの電流調整抵抗とみなせば、LEDはここに直列につなげばよい。

 2秒に1回くらい、つまり0.5HzくらいでLEDをチカチカさせる場合を考える。とりあえず手持ちの部品で47μFの電解コンデンサがいくつかあるのでそれを使いたい。左右とも同じ周期で発振させるなら、この場合はR2とR3、C1とC2は同じ容量のものを使えばよい。なので、先ほどの式は

f=\cfrac{1}{T}=\cfrac{1}{ln(2)\cdot 2RC}=\cfrac{\frac{1}{ln(2)\times 2}}{RC}\fallingdotseq\cfrac{0.72135}{RC}

……というふうに簡単になる。

 手持ちの電解コンデンサ47μFで、0.5HzくらいのLチカをやりたいときの抵抗は、

R=\cfrac{0.72135}{0.5\cdot 47\times10^{-6}}\fallingdotseq 30695.74468\fallingdotseq 31k\Omega

……というふうになる。

 私のガラクタ箱の中に入っている一番近い値の抵抗は、10kΩだ。代わりにこれを使うと、結局、

f=\cfrac{0.72135}{RC}=\cfrac{0.72135}{10k\Omega\cdot47\mu F}=\cfrac{0.72135}{10000\times47\times10^{-6}}\fallingdotseq1.535(Hz)

……というわけで、2秒に3回くらいチカチカするものが作れる。

 とりあえず、C1とC4、つまり両側の電流調整用には330ΩとLEDを直列に入れる。

 適当なトランジスタがないので、買う。NPN型の定番品に2SC1815というのがあり、秋葉原千石電商で10個入りのパケットが150円だ。

IMG_3294

 この「2SC1815」は汎用的に使われている石なので、さまざまな電子工作にもよく登場している。余分に持っていて損はないし、10個で150円ならお金を使った気にすらならないので、一袋買っておくのは正解だと思う。

 ブレッドボードに並べれば、次のようになる。

IMG_3299

 上のほうに3端子レギュレータを設け、ACアダプタの13Vを5Vに落としている。切り欠きのあるトランジスタふたつ、切り欠きに向かって左からエミッタ・コレクタ・ベースなので、――昔はこれを「E-C-B」とも「エ・ク・ボ」とも覚えたものであった――ベースから黄色いジャンパで「たすき掛け」になっているところがよくわかる。R1・R4が下のほうの抵抗で、茶・黒・橙(1・0・3、10×10の3乗)の10kΩであることが見て取れる。

 動かすとこんな感じである。

 次に、この「Lチカ周波数」をできるだけ正確に測ってみよう。私はオシロスコープなど持っていない。そこで、LEDの電流調整抵抗の後に直列にArduinoのデジタル入力をつなぎ、LOW~LOWの間をμ秒単位で計れば、周波数がわかるわけだ。電源も5Vなので、ちょうどよい。

 スケッチをこのように書き……

//
//  MB2f.ino
//    非安定マルチバイブレータの周波数を測る。
//    27.08.23(日) 1400~
//    佐藤俊夫
//
#include <stdio.h>
//
const int MB = 2;  //  デジタル2番ピン
//
void setup() {
  pinMode(MB, INPUT);
  Serial.begin(9600);
}

void loop() {
  static unsigned long int prevtime = 0;
  static int prevstatus = HIGH;
  int nowstatus = digitalRead(MB);
  if(nowstatus != prevstatus){
    if(nowstatus == LOW){
      unsigned long int time = micros() - prevtime;
      float f = 1000000.0 / (time);
      char s[32], sf[32];
      sprintf(s, "t = %ld microsec, f = %sHz", time, dtostrf(f, 5, 3, sf));
      Serial.println(s);
      prevtime = micros();
    }
    prevstatus = nowstatus;
  }
}

 それから、このように繋ぐ。

IMG_3301

 Arduinoのシリアルモニタで観測すると、波長から周波数が計算されてくる。

非安定マルチバイブレータ周波数測定

 2.062Hzとなっているから、最初の計算の1.5Hzからすると、だいぶ誤差があるが、CR回路の発振なんて、こんなもんである。

 さて、この「非安定マルチバイブレータ」は、回路にコンデンサが含まれていることにミソがある。ふたつのコンデンサが入っているからその充放電の働きにより発振し、放っておいても時間ごとに切り替わるのである。

 そこでこのコンデンサをとっぱらい、少し回路の配置を変える。

 そうするとアラ不思議、状態を保持する1ビットの記憶素子、「フリップフロップ」になるのである。

フリップフロップ(2安定マルチバイブレータ)
フリップフロップ

 この場合、トランジスタのベースから出したスイッチを押すたび、状態が切り替わる。

 ブレッドボードに組むとこうなる。

IMG_3302

 動かしている様子である。

 ボタンを操作するたび、光っているLEDが代わる。二つの状態のいずれかを保持しているということであり、それが1ビットの記憶ということである。2安定マルチバイブレータが1ビットのメモリーだということがここからもわかる。

ユーザー作ったりとか

投稿日:

 Raspberry Piで遊ぶ。

 私が買ったのは、「Raspberry Pi 2 Model B」という最新のものだ。オライリー・Make:PROJECTSシリーズの「Raspberry Piをはじめよう」で解説されているのは古い方の「Raspberry Pi モデルA」「同B」なので、少しづつ合わないところがあるが、ごく細部を除いては、特に気にする必要はない。細部の違いが影響してくるのは、よほど高度なことをやる場合だ。

 今さら私が述べ立てることではないと思うが、私と同じような人で、Rasberry Piのことを知らない、という人に向けて書けば、結局はこうだ。

  •  Raspberry Piは、GPIOインターフェイスボードを積んだ普通のPCだと思えばよい。
  •  普通のPCなので、Linux系OS以外にも、Windows10なども使える。だが、成果物のほとんどはRaspbianというLinuxディストリビューション上で得られているので、OSにはRaspbianを選択しておくのが無難。
  •  前記GPIOは、普通にファイルに見えるので(と言っても、/devの下にデバイスファイルがあるわけではない;もちろん、シンボリックリンクでそういうふうにすることはできるが)、標準出力でファイルを開け、書いて閉じれば、それでGPIOにつないだ電子工作をコントロールできる。
  •  Arduinoに比べると、ロジックが正=3.3Vであること、アナログ入力がないことなどが違う。解説書「Raspberry Piをはじめよう」にも、
    「最初にRaspberry Piのニュースが流れたとき、それがArduinoキラーになるのではないかと多くの人が考えました。値段はたいして違わないのに、Piはずっと大きなCPUパワーを持っています。だったらArduinoを使う理由はもうない、というわけです。しかし、やがて両者は補完的な関係にあることが分かってきました。以下のような状況を考えると、ArduinoとPiを組み合わせるメリットが見えてきます。

    • Arduinoの豊富なライブラリと作例を活用したい。
    • すでにうまく動いているArduinoプロジェクトにCPUパワーを追加して、もっと高度なことがしたい。
    • 5Vで動作する回路を扱いたいが、Piは3.3V動作で、5V入力に対応しない。
    • 誰かがプロトタイピングの過程で少しばかり無茶をしてチップがダメージを受けた時(Arduinoのピンにモーターを直結している人を見たことがあります)、Arduinoならば数百円以下でスペアのチップを買って自分で交換することもできるが、Piでそれをするのはほぼ不可能。
    •  3Dプリンタ用コントローラのように高精度なリアルタイム処理を必要とするものを作るとき、リアルタイムOSとは言えないRaspbianよりも、命令サイクルを計算できるマイクロコントローラのほうが要求に適う可能性が高い

    (p.88冒頭から引用)
    ……等とある。

  •  Linuxなので、使い始めるにはとりあえずrootを把握して、ユーザを作ればよい。作りつけのユーザもあるが、私のようなおっさんは、まず
    「# useradd -g pi toshio ; passwd toshio ; mkdir /home/toshio ; chown toshio:pi /home/toshio」
    ……なんてことをやらないと落ち着かないのである。
  •  さまざまな作例等はPythonの利用が想定されているので、さまざまな作品例のマネがしたければPythonを使えばよいが、前記したように「普通のLinuxマシン」なので、PerlだろうがCだろうが、おっさん系の言語も全部使えるから、私のようなおっさんは自分が使いたい言語を使えばよい。

 なので、例えば、「Raspberr Piをはじめよう」の102ページあたりに載っている最初のLチカの例は、次のような方法でも再現できる。

#!/usr/bin/perl
#  perl2LED
#    perlでLチカ
#    27.8.16(日)
#    佐藤俊夫
#
open(GPIO25, ">/sys/class/gpio/gpio25/value");
GPIO25->autoflush(1);
while(){
  print GPIO25 1;
  sleep(1);
  print GPIO25 0;
  sleep(1);
}

……などとPerlで書き、「gpio25」をユーザ空間にエクスポートして、

# ./perl2LED

 とやると、LEDが1秒おきにチカチカするのである。

Raspberry PiでのLチカ最初の例
IMG_3285

ノクターンでLチカ

投稿日:

 いやもう、「オッサンとバイエル、ピアノ等」って銘打ってて、長らくなかったこのネタ。ええ、ピアノですよ、ピアノ。

「Arduinoをピアノにつなぎたいッ!」

……すなわちコレである。Arduinoをピアノにつなぎ、LEDをピアノ演奏に合わせて明滅させようというものだ。

 いまや遅しとやってみた。

ノクターンでLチカ

 一つ覚えみたいにノクターンで申し訳ないですが(笑)、すんませんレパートリーがあんまりないもんで。

IMG_3276

 アナログピンからピアノの音声出力を読み、それに合わせてTLC5940NTに接続されたLEDを適宜明滅させるわけである。いかにもピアノ風味に明滅させるにあたっては、乱数によるLED選択と、先日会得した「PWMを十分に使い、余韻をもって各LEDを徐々に消す」という技を遺憾なく使用した。

 これをやるには、アナログピンに上手に音声を入れる必要がある。

 こういう時、電圧レベルを知るのにオシロスコープなどが使えればいいのだが、残念ながら持っていない。そこで、あらかじめテスターのACでテレビ、ラジオ、自分のピアノなどの音声出力端子からだいたいのレベルを推定し、次に十分な抵抗を入れて、Arduinoのアナログピンに入力して読み取った。その結果、だいたい200mVの振幅程度であることがわかった。これならばArduinoに直接入れてもどうということはなさそうだ。ただし、レベルが小さいから、ソフトウェアのほうでうまくやる必要がある。

 次に、音声はアナログ信号だから、プラス・マイナスに振れる。一方、Arduinoのアナログ入力は0~5Vの間を1024分割で読むのだから、ここをうまく工夫しなければならない。

 まず、2.5Vを中心に電圧が振れるよう、2.5Vを生成して合成する。ちょうどTLC5940NTを動かすために5Vの3端子レギュレータを使っているので、ここから抵抗分圧で2.5Vを作り、それを合成する。合成するとき、出力側の音声端子に電流が流れ込んではまずいから、コンデンサを0.1μFばかりつける。周波数は見当がつくが、電圧の見当がつきにくいので、とりあえず0.1μFにして、出来が悪いようなら取り換えることにする。

 まず、大して疑問もない簡素な付加回路。たしか、パルス技術ではこういうの、「クランパ」って言ったっけな……。

音声入力のためのクランパ
「voice2tlc」の回路図

 それで、TLCなどと一緒にLEDを植え込む。

IMG_3273

 ミニジャックを接続するために、秋月電子の「ステレオミニジャックDIP化キット」を取り付けた。

ミニジャックの部分
IMG_3274

 で、スケッチはこうなった。

//
//  voice2tlc.ino
//    アナログピンに音声を入れ、TLC5940NTを使ってLEDを光らせる。
//    27.08.13(木)1000~
//    佐藤俊夫
//
#include "Tlc5940.h"
#include <stdio.h>
//
const int
  AUDIO = 0, //  アナログ0ピン
  THRESH = 8;  //  8単位以上のレベルならLEDを点灯
//
void setup() {
  Tlc.init();
  Tlc.clear();
  Tlc.update();
}

void loop() {
  int v = 0, l = 0;
  static long int prevtime = 0.0;
  static int prevv = 0;
  v = abs(analogRead(AUDIO) - 512);
  l = constrain(fmap(v, 0, 15, 0, 4095), 0, 4095);
  if(millis() >= prevtime + 10){
    prevtime = millis();
    for(int i = 0; i <= 15; i++){
      Tlc.set(i, Tlc.get(i) * 0.9);
    }
  }
  for(int i = 0; i <= 15; i++){
    if(random(0, 16) == 1 && prevv != v && v >= THRESH){
      Tlc.set(i, l);
    }
  }
  Tlc.update();
  prevv = v;
}
//
float fmap(float x, float in_min, float in_max, float out_min, float out_max) {
  //  もともとの「map()」がlong int型でこの用途に合わないので、float型を定義
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

ブレボー亀の子

投稿日:

 ブレッドボードに小さいプロトタイプを作るとき、この「プロトタイピングシールド」も捨てがたい。だが、しばらく使ってみての感想なのだが、小さくて不便だ。また、電源ラインもどうも使いづらい。シールド上の赤ソケットには実は5Vは到達していないので、自分で配線しなければならないのだ。

便利だが、小さいところが難
IMG_3031

 と言って、大きい方だと、Arduinoに重ねるわけにもいかず、昨日のようになってしまう。

たかが7セグLED2個のためにゴチャつくブレッドボード(笑)
IMG_3240

 何かいいことないかな、と思ってネットを漁っていたら、ある方がブレッドボードの脇に直接Arduino用のピンヘッダを接着剤で取り付けて、目的を達成しておられるのを見つけた。ほほー、なるほどなるほど……。

 つまり、大抵のブレッドボードは、同じメーカーの物なら、こういうふうに脇を取り外したり組み合わせたりできるのだが、電源ラインを一つ外すと、Arduinoの上下のピン幅とピッタリなのである。

IMG_3252
IMG_3253

 チナミに、このようにバラしたり組み合わせたりするには、ブレッドボード裏の両面テープの、つけ外しする部分をカッターナイフでスーッと切ると良い。

 しかし、接着剤でピンソケットを付けてしまう、てのも、なあ……。他のことにブレッドボードが使えなくなってしまうし……。

 で、考えてみたら、私は次の写真のようなArduino用のプラスチックケースを使っているが……

IMG_3254

……この上に電源ラインを一本外したブレッドボードを亀の子にし、輪ゴムか何かで縛っておけば、目的は達成できるではないか。

IMG_3255

 どうして今までこうしなかったかと言うと、そのままだとプラスチックケースの上下に細く開けてあるピンソケットにアクセスするためのスリットがふさがり、Arduinoから信号線が出せないからである。しかし、電源ラインを外すと、上下ともちょうどピッタリ、スリットが隠れずにすむのだ。

 ほうほう、なるほど、というわけで、この前作ったビーズのLEDなど植えてみる。Arduinoの「Arduino AT HEART♥」みたいな感じで、ハートですな、男のくせにw。

IMG_3256

 動かすとこんな感じ。

 このLチカはシンプルで、スケッチはこう。

//
//  differSin.ino
//    サインカーブをちょっとづつずらしてLチカ
//    佐藤俊夫
//    27.08.11(火) 1100~
//    
void setup() {
  pinMode( 9, OUTPUT);
  pinMode(10, OUTPUT);
}

void loop() {
  static float x1 = 0.0, x2 = 0.0;
  x1 = x1 > (2.0 * PI) ? 0.0 : x1 + (2.0 * PI / 1000.0);
  x2 = x2 > (2.0 * PI) ? 0.0 : x2 + (2.0 * PI / 1100.0);
  analogWrite( 9, (int)((sin(x1) + 1) * 128));
  analogWrite(10, (int)((sin(x2) + 1) * 128));
  delay(2);
}

 そう言えば、以前、「なんとっ!Arduinoって3項演算子ないのかッ!?」「ううっ、あったらなあ」などと書いたことがあったが、これは早とちりで、私の間違い。ちゃんとありました。上記スケッチでご覧のとおり(苦笑)

お稽古

投稿日:

 7セグメントLEDのお稽古をする。意味のあるなしはどうだってよろしい。レッツゴー。

 私は古株ぶっているが、実は若い頃に7セグLEDを扱ったことがない。子供の頃の電子工作はもっぱらラジオなどのトランジスタ回路、長じてからは仕事関係で5極真空管やマイクロ波の発振管などを扱っていた。

 数値表示のためには、その頃の仕事関係では「ニキシー管」という数値表示のための真空管を扱っていた。これは放電管で、数字の形をした陰極が赤く光るものだ。

 そういうわけで、7セグLEDを知らないのである。いや、無論、当時から7セグメントLEDは世の中にあったが、私の職場が特殊だったのである。

 で、これが昨日秋月電子八潮店で買ってきた、1個60円の7セグLEDである。

IMG_3234
IMG_3236
OSL10561-IRA

 さて、まずは点灯からだ。データシートから、抵抗と電流っ。

 各素子I_F = 20mA, V_F = 2.1V……とあるから、V_0 = 5Vとして、

I_R = \frac{V_0 - V_F}{I_F} = \frac{5 - 2.1}{20mA} = 181.25\Omega

……まず、200Ωばかりつけておいてやればよいのだろう。この前買った集合抵抗の手持ち、8素子9ピンで330Ωのがあるから、それを付ければ多少暗いが10mA前後で光るだろう。

 さっそく、全点灯で光らせてみよう。単に電源をくれてやって、抵抗に結線するだけだ。

7セグLED全点灯
回路図

 光らせてみると、計算上の抵抗の倍近い抵抗値なのに、なかなかどうして、結構明るく光る。

IMG_3237
単純全点灯で光らせてみたところ

 次に、Arduinoをつないで、数字を表示させる。全点灯で電流を測ってみると67mAほど流れているので、電源はこのまま別建てのほうがいいだろう。

 アノードコモンのLEDであるから、カソード側で制御しなければならない。集合抵抗では一本づつ制御できないので、330Ωの電流制御抵抗をバラで8本とりつける。それぞれの足をArduinoのデジタル2ピンから9ピンまで取り付ける。

 スケッチをこう書く。点灯のパターンは配列に書くのが手早いだろう。

//
//  7segmentLED_1.ino
//    7セグメントLEDを1個動かす。
//    27.08.10(月) 1300~
//    佐藤俊夫
//
//    LED「OSL10561-IRA」
//    LED 1 -> Digital 2
//    LED 2 -> Digital 3
//    LED 4 -> Digital 4
//    LED 5 -> Digital 5
//    LED 6 -> Digital 9
//    LED 7 -> Digital 8
//    LED 9 -> Digital 7
//    LED10 -> Digital 6
//
void setup() {
  for(int i = 2; i <= 9; i++){
    pinMode(i, OUTPUT);
  }
}

void loop() {
  for(int i = 0; i <= 9; i++){
    lighting(i);
    delay(1000);
  }
}

void lighting(int n){
  const int pat[10][8] = {
    { LOW,  LOW,  LOW, HIGH, HIGH,  LOW,  LOW,  LOW},  //  0
    {HIGH, HIGH,  LOW, HIGH, HIGH, HIGH, HIGH,  LOW},  //  1
    { LOW,  LOW, HIGH, HIGH,  LOW, HIGH,  LOW,  LOW},  //  2
    {HIGH,  LOW,  LOW, HIGH,  LOW, HIGH,  LOW,  LOW},  //  3
    {HIGH, HIGH,  LOW, HIGH,  LOW,  LOW, HIGH,  LOW},  //  4
    {HIGH,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW, HIGH},  //  5
    { LOW,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW, HIGH},  //  6
    {HIGH, HIGH,  LOW, HIGH, HIGH,  LOW,  LOW,  LOW},  //  7
    { LOW,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW,  LOW},  //  8
    {HIGH,  LOW,  LOW, HIGH,  LOW,  LOW,  LOW,  LOW}   //  9
  };
  int i = 0;
  for(i = 0; i <= 7; i++){
    digitalWrite(i + 2, HIGH);
  }
  for(int i = 0; i <= 7; i++){
    digitalWrite(i + 2, pat[n][i]);
  }
}

 アノードコモンなので、論理は負論理だ。

 Arduinoとブレッドボードをこういうふうにする。

IMG_3238

 動かすと、ゆっくりカウントアップする。

%d人のブロガーが「いいね」をつけました。