PIC16F628とArduino

投稿日:

 割合にシリアスな話なのだが……。

 休暇中にArduinoなどいじっているのは、実は、多少、以前の仕事上の屈託があってのことだ。

 4年ほど前、仕事で「PIC16F628」という石を触ったことがある。これは、新規の仕事ではなく、古いプロジェクトのメンテナンスだった。

 当時すでに古い石だった「PIC16F628」だ。36ピンのパラレルにつなぐROMライタでプログラムを焼く。

 使えるのはPIC16F628独特の、たしか1語長14ビットという変わったアセンブラのみ。

 しかも、いったいどういうマネジメントか、ソースコードが消失していた。ROMイメージからディスアセンブルした不完全なソースを参考に、バイナリを直接直さなければならなかった。

 そのプロジェクトはもう忘れられかけたプロジェクトで、それが立ち上がった頃は華々しくもてはやされ、かかわった人たちは表彰などされたのだが、私が始末を押し付けられた頃にはもう何年も経っており、腐ったプロジェクトに成り果てていた。

 誠意をもってメンテしたが、誠意を持とうが持つまいが、私には何の得もないし、また、組織にとってもなんの得もないという腐った作業だった。ただ、やらなければならないことになっており、しかも、それをやると私が叱られる、という、わけのわからない仕事だった。つまり、「叱られる奴を出さなければならない」という仕事なのだ。

 実は当時、既にArduinoは発売されて普及していた。私もそれを知っていた。もし、その腐ったプロジェクトが新規に始まったもので、最初から私に任されたものだったら、私はPIC16F628などではなく、携帯電話かArduinoを使用しただろう。

 そうできなかったことが、当時本当に悔しかった。

 ArduinoはPIC16F628のような苦労をしなくてよい。C言語ライクにプログラミングでき、倍長実数まで扱え、アナログ入出力ができ、ごく安い値段でイーサネットやBluetoothまで扱える。

 自宅の小机の上で「Lチカ」なんぞ試し、夜、赤いLEDが間遠に明滅するのを眺めると、ほんの数年前のそのことがホロ苦く思い出される。



Arduino入門キットのサーミスタ

投稿日:

 先日、Arduino UNOと一緒に買った入門キットは、「seeedstudio SIDEKICK BASIC KIT」と言うもので、千石電商の2階に置いてあったから無造作にヒョイと選んだものだ。

 ブレッドボードにジャンパ各色、小さいサーボ、可変抵抗、抵抗、チルトスイッチ、ダイオード、ボタンやスイッチ、ブザー、LED各種、コンデンサ、Cdsセル、サーミスタなどが詰め合わせになっており、オライリーの「Arduinoをはじめよう第2版」の題材を一通り試せるようになっている。

 まず過不足のないところなのだが、seeedstudioというのは何分中国企業で、日本語のドキュメントが少ない。

 と言っても、部品は簡単なものばかりなので、特にドキュメントなどなくても自分でテスターで計りながら使えばそれでよいのだが、この中の、サーミスタに関する情報が非常に少なく、難渋する。

 サーミスタには写真のように「503」と刻印があるのみで、なんの情報もない。

 ネット上で探すと、一応、seeedstudioのFAQページに、情報があることはある。

  •  そのページ
  •  その中に、中国語のPDFで、こんなシートがある。

     要するに「MF11-503K」という型番で、「503」というのはどうやら、「25℃で50kΩ」とでも言う意味らしい。

     で、電圧発生抵抗を一本入れて、えーっと、どういう計算になるんだっけな、……と初心に帰る。

     抵抗2本、直列に入れた時の一本目の抵抗の電圧はこうだから……


    Scan10001

     自分の指でつまんで温めたりして試したいんで、ターゲット温度を体温前後にする。なので、データシートどおりに抵抗が変化するんなら、こういう感じに電圧は変化する。


    Scan10002

    ……で、Arduinoのアナログ入力は、0V~5Vを0~1024にマッピングするんで、1024/5をこれらにかけて、近似させればいいよね。

     2次式モデルでこうなった。

    v = -9.663E-5 * v * v + 0.164 * v + 0.197;

     結局、サーミスタに直列に10kΩ、サーミスタの下からアナログへ出して、サーボにつなぐ。サーボの針が体温で上がったり下がったりするわけだ。

     コードはこんな感じ。

    //
    //  サーミスタでサーボを制御
    //    佐藤俊夫
    //    27.05.05(火)
    //
    #include <Servo.h>
    //
    const int SERVO = 9;  //  D9(Servo)
    const int THERMISTOR = 0;  //  A0
    const float INMIN = 30;
    const float INMAX  = 40;
    const float OUTMIN = 5.0;
    const float OUTMAX = 175.0;
    //
    Servo meter;
    
    void setup() {
      meter.attach(SERVO);
    }
    
    void loop() {
      int v = 0;
      //
      v = analogRead(THERMISTOR);
      v = -9.663E-5 * v * v + 0.164 * v + 0.197;
      v = map(v, INMIN, INMAX, OUTMIN, OUTMAX);
      v = constrain(v, OUTMIN, OUTMAX);
      meter.write(v);
    }
    
    

     



    3色LEDをパルス幅変調

    投稿日:

     Arduinoの入門キットには3色LEDがついているので、これを光らせて遊ぶ。チカチカでは面白くないから、各色にパルス幅変調をかける。変調は正弦波でかけ、各色の位相をちょっとづつずらしていろんな色にする。



    ポテンショメータをつないで

    投稿日:

     次は、ポテンショメータをつないで、アナログ入出力をマスター。

     9番ピンを使用したパルス幅変調もわかったし、ついでに、さっきシリアルへのアクセス方法が分かったから、IDEに式ウォッチ機能がない代わりに、出力をシリアルにタレ流して観測する方法も会得。

    IMG_2748

    //
    // ポテンショメータとLEDのPWM制御
    //  佐藤俊夫
    //  27.05.01(金)1604~
    //
    const int LED = 9;
    const int POTENTIOMETER = 0;
    //
    void setup() {
      pinMode(LED, OUTPUT);
      pinMode(POTENTIOMETER, INPUT);
      Serial.begin(9600);
    }
    
    void loop() {
      int bright = 0;
      bright = analogRead(POTENTIOMETER) / 4;
      Serial.println(bright, DEC);
      analogWrite(LED, bright);
    }
    



    教科書のコードをいろいろとカスタマイズ

    投稿日:

     晩御飯を食べて、引き続きArduinoで遊ぶ。

     教科書の本文には「割り込み処理」が載ってなかったのだが、巻末のリファレンスには割り込みの関数がちゃんとある。

     押ボタンスイッチでトグルする処理は、やはりポーリングではなく、割り込みによらねば面白くない。

     それで、押しボタンを押すたび、LEDの点灯の流れが変わるようなものをこしらえて遊ぶ。

    //
    //  LED3つを順々に点灯,割り込みがかかると反対向きになる。
    //
    //    佐藤俊夫
    //    27.4.29  1930
    //
    const boolean FOW = true;
    const boolean REV = false;
    boolean STATUS = REV;
    int LED[] = {13, 12, 11};
    int i = 0;
    int previ = 2;
    
    void setup() {
      //  LED3つ初期化
      for(int i = 0; i <= 2; i++){
        pinMode(LED[i], OUTPUT);
      }
      //  0番割り込み(2番ピン)で反転
      attachInterrupt(0, switchdirection, RISING);
    }
    
    void loop() {
      //  順々点灯
      previ = i;
      if(STATUS == FOW){
        i++;
        if(i > 2){
          i = 0;
        }
      }else{
        i--;
        if(i < 0){
          i = 2;
        }
      }
      digitalWrite(LED[i], HIGH);
      digitalWrite(LED[previ], LOW);
      delay(1000);
    }
    
    //  LED点灯方向を反転させる 
    void switchdirection(){
      if(STATUS == FOW){
        STATUS = REV;
      }else{
        STATUS = FOW;
      }
    }
    



    それでまあ、Lチカで遊ぶ。

    投稿日:

     買ってきたガイドブック、オライリーの「Arduinoをはじめよう」に載ってるLチカは1種類だけだが、それでは面白くないのである。LEDの光らせ方しかわからなくっても、並べればこうやってもうちょっと楽しくなるのだ。

    ……と、いうわけで、さっそく教科書通りにいかず脱線する私。

     そういえば、と思い出す。小学生の頃、理科の実験などあると、私はすぐ何かとアレンジを施したがり、「先生の言ったとおりにしていない」「教科書に載っていないことをしている」として周りの子に言いつけられ、厳しく叱られたものだった。

     いや、そりゃ、化学の薬品なんか使う実験で先生の言ったとおりにしないのは問題があるだろう。だから当時の先生に文句はまったくないが、あの微妙な実験カスタマイズの経験は後年の私に大きく影響を及ぼした。

     8ビットマイコンとBASIC言語全盛の頃、プログラミング雑誌が多くあった。「I/O」や「BASICマガジン」などと言った雑誌にはプログラミングリストが載っており、これを掲載のとおり打ち込めばゲームなどが出来たのであるが、私はこのプログラムリストを機械的に打ち込むのが大嫌いだった。載っている通りには絶対に打ち込まなかったし、しばらくすると、土曜日に本屋で立ち読みでリストを読んで「あらすじ」を覚えて帰り、日曜日に自分のPCで再現する、ということをよくやった。

     単に楽しかったからそうしていただけだが、振り返ると、あれでプログラミング力は大いについたように思う。



    「眼をそらす」考

    投稿日:

     かなり前のことだが、新聞でこんな話を読んだことがある。

     ある工学者が、ロボット研究の一環としてちょっとした玩具を作った。縦横に走り回るタイヤがついた一種のロボットで、十数個ほどが組になっている。ランダムに走り回るのだが、ロボットの前方にはCDSセルなどに類する受光素子が、後方にはLEDの発光器がついている。これをバラバラに走り回らせて放っておくと、他の個体の後ろにあるLEDを感知して追従し、次第次第に列をなし、しまいには十数個が自然に一列になってぐるぐる走り回る、というおもちゃである。

     どの個体も、機械的に同じように作られている。したがって、どう走らせようと列をなす順番はランダムになるはずである。ところが、なぜか、どうしても先頭になりやすい個体があり、何度も試して統計をとると、統計上無視すべからざる有意な傾きで、先頭になりやすいもの、2番目になりやすいもの、ビリになりやすいもの、と、電子的な機械なのに、癖が出てくるものなのだそうな。

     工学者はそのことがどうにも不可解なのでよく調べてみたという。

     原因は意外なところにあった。

     このロボットは、正面から向き合ったときに衝突するのを防ぐため、正面にも発光器をつけてあり、別の個体が正面から向かってくるのを衝突回避用の受光器が感知すると、必ず右に向きをそらせて走行するようになっていた。いわば「眼をそらす」ようにして、衝突を避けるしくみなのである。この「眼をそらす」動作に、ほんのごくわずかな工作加工上の差があり、個体によって回避動作がゼロコンマ何秒かづつ違うことがわかったという。このやや回避動作の遅いものは、自然直進しがちとなり、どうしても他の個体はこれに追従するようになる、その回避速度の差が、個体ごとに順序の癖となって現れていることがわかった、というのだ。

     この、かなり前に聞いた単純なおもちゃの話が、私にはどうも、我々人間様も、例えば 餓鬼大将の決まり方などに、似たような理由が作用しているように思えてならなかった。というのも、子供の頃の「先頭の奴」は、かならずしも優秀とか能力が高いとか言うわけではなく、また親切でもなく優しくもなかったように思うからだ。

     どちらかというと、「適度に鈍い奴」が先頭になっていた気がする。

     中学生くらいになって、ヤンキーの怖い奴の眼を見ると、

    「『めんち』を切った」

    …なぞと言って因縁を吹っ掛けられるので、触らぬ神にたたりなしと、私など弱小のその他大勢は、まともにヤンキーの眼など見なかったものである。ちなみに、この「めんち」というのは、関西弁の言い方だ。私は大阪出身なので、この言い方のオイシさにゾクゾクきてしまうが、関東の人などは「ガンをつける・飛ばす」などと言うのが普通だろう。

     さておき、それよりもう少し成長して、武道を学んだり、社会に出たりなどすると、

    「相手の眼をよく見ろ、眼をそらすな、相手の気持ちもこちらの気持ちも眼に現れるのだ」

    …なぞと(しつ)けられるようになる。素直な若者であった私も、こうした上司や先輩の教えをよく聞いて、人の眼を見るようになったものだが、これがまた、落とし穴なのだ。

     だんだんと実際の生活を送るようになればわかることだが、いつでもどこでも誰の眼でも、じっと睨み付ければそれでいいというものではないのである。

     上司などは、目下の部下を叱責などしているときに、じっと眼なんぞ見られると「コイツ、ふてぶてしい奴だ」と不快を覚える場合もある。あるいは、これも場合によるが、女性などは男にじっと眼を見られると、恐怖を覚えたりする。これは、顔が笑っていればそれでいいというものでもなく、笑っていようが真剣な顔であろうが、眼を見られれば不快なときには不快なのである。

     ある「面接試験の受験心得」のようなものを読んだことがある。それには、

    「基本的には面接員の顔、特に眼を見るべきではある。しかし、面接員の眼をあんまり激しい視線でじっと見つめすぎると、人によっては不快を覚えたり、生意気な受験者だとの印象を与えてしまう場合もある。そこで、面接員の眼がみづらいな、と感じたら、自然に胸の辺りを見れば、それほどとがった印象を与えずにすむ」

    …などと書かれていて、これはだいぶ世間というものをわかった人が書いたのだな、と思ったことがある。ただ、それはかなり古いテキストで、女性の面接官や面接員があまりいなかった時代だ。今だと、女性の胸などじろじろと見ていたら、それはそれで多少問題があり、どこを見たものか、なかなか難しい。

     なにしろ、「人の眼を見ろ!」なんてことを厳しく躾けるオッサンに限って、自分の眼を見つめられると怒り出す、なんていう笑えない一幕も世の中にはよくあるのであるから、生活と言うのはこれでなかなかどうして、微妙なものである。

     人と向き合うときに眼を見ることには、このように少しばかり気遣いが必要だが、街の雑踏などを歩いていて、向かってくる相手を見る、見ないということに、いろんな類型を見いだして興味深く思うことがある。

     例えば、「あ、このまま直進すると、向こうから来るあの人とぶつかるな」と気づいた際の行動だ。こうしたとき、

    ● 相手をよく見て、その出方で、こちらも避ける方向を決める。

    という、ノーマルな行動をとる人がほとんどだと思う。だが、ありがちなことだがこの方法は、お互いに同じ方向に避けあって、2、3度タタラを踏んでしまう、という滑稽なシーンを現出させる。

     時々見かける、決して少なくはない類型に、

    ● ぶつかりそうだな、と思ったとたん、「えーっと」と、横や後ろに眼をそらしてしまい、そのまま直進する。

    …という人がある。意外とこういう人は多い。こうなると、相手の方が「あ、あいつ、こっちを見てないな、しょうがない、俺が避けよう、やれやれ」と瞬時の判断で自然に避けるわけである。

     これはうまいやりかたのようでいて、どうも、快くはないやりかたである。時々、双方ともそういう行動をとって、ついにぶつかってしまい、双方がすんませんすんません、と謝りあっている光景などを駅で見かける。

     実はこの私も、一時期そんな癖がついてしまったことがある。ところが、あることがあってやめた。

     大人になってからなのだが、向こうから来た人にぶつかりそうになり、その頃のなんとはない癖で、ひょいと眼をそらして直進した。ところが、向こうから来た、金髪入れ墨のヤンキー兄ちゃんは、どうもじっと私を注視しながら直進を敢行したとおぼしく、どんとぶつかって、低い声で「コラ」と言ったものだ。

     その時には、あ、ごめんなさいで済んでしまい、特段トラブルにもならなかったのだが、自分の行動様式を見直した私は、この「眼そらし直進」をやめ、向こうの眼などを見て通行するようになった。そうすると、こちらが避けるにせよ、相手が避けるにせよ、意外に通行しやすいことがわかったのである。

     困るのは、この「眼そらし直進」を、自動車を運転中に、歩行者に対して実行する人物がいることだ。これはもう、ぶつかって「すんませんすんません」ではすまない危険極まるやりかたであるから、やめるべきである。自動車を運転しているときに「『めんち』を切った」なぞと中学生のような因縁をつける者などいないのであるから、どうか周囲の車や横断歩行者の動向をもれなく注視してもらいたいものである。

     私などには、実は別の悩みもある。どうも、私は裸眼のせいもあってか、「どこを見ているかわかりやすい」らしい。自分ではわからないのだが、つまり、視線に遠慮がないようなのである。

     雑踏などで向こうから来た若い女性が、私と眼が合うや、急に胸元をかきあわせたり、そわそわと自分の服装をチェックしたりすることが多く、なんでだろう、と思っていたのだが、どうも、私がじろじろ見るのがいけないらしい。そのため、昼間はおろか、真夜中にすら視線隠しのサングラスをかけるようになってしまった。私も見ず知らずの人に視姦魔扱いされて嫌われたいわけではないからである。

     とまれ、眼を見てみたり今度は逆にそらしてみたり、なかなか視線の置き所がないものだ。若い女が極端に短いデニムのパンツなどを穿いて白い脚をむき出しに組んでいたりするのを見ると「眼のやり場に困る」という慣用句を使いたくなるが、別段裸体の女性がいるわけでもないのに眼のやり場に困っている私は、まったく因果なことを気にしているな、とも思うのであった。