SparkFun.com’s dumpster dive

Sparkfun’s dumpster dive is once in a few months event when they prep a limited amount of red boxes filled with rejects and some left over that they don’t feel as retail quality merchandize for various reasons, and put them on sale.

I bought these boxes on two occasions so far and I am reasonably pleased.
Let me share my experience.

  • Sale.
  • The sale takes place on select Fridays. In both occasions I learned about the sale when I visited the site to check out their blog section for new products, which they announce on every Friday morning.
  • The sale event will occur at 12 noon MT.
  • The whole lot will only last a couple of minutes, then the sale will be over.
  • Prior to Noon, you go to the site, login and go to the product page(DD-12012). There is no purchase button displayed yet. Precisely at 12 Noon, you start hitting the F5 key to refresh the screen. Once you see the Buy button, click on it to secure your purchase. If you can go through the purchase process in less than 2 minutes (confirming your address, shipping method and payment information and so so on – the fact you are already logged in will help expedite the process), chances are you will be rewarded with the order confirmation page.
  • Wait with a great anticipation for 3~4 days for the box to arrive.
  • Open the box and find out what is in there.
  • First purchase. (Feb 2014) – All parts listed were confirmed functional.
    • Pcduino v1 x1
    • PIC KIT2 compatible CANAKIT programmer x1
    • Vehicle diagnostic kit x1
    • Sonar module x2
    • FTDI USB-Serial converter (3.3V) x1
    • Stepper motor driver board array. I was able to separate 5 good boards while destroying 1 using dremel
    • A lot of electrolic capacitors
    • One comparator, One photo interrupter, One gap sensor, One ADC.
    • Half dozen of banana plugs
    • USB bluetooth dongles.
    • 3 pin rotary encoder x1
  • Second purchase
    • LCD module 24 chars x 2 lines
      It had 14pin connector. Using Arduino example sketch and pin out information I gathered from Internet, The module was confirmed functional. There is a two terminal pad on PCB which is obviously for backlighting and it looks like EL lighting. $10 value.
    • LCD module 16 chars x 2 lines
      There was a 14 pin ribbon cable coming out from the module. Again I used the pinout and Arduino Uno to confirm the functionality but this one did not work at the first time. It turned out the ribbon cable was broken, so I removed it and replaced with a header connector. The part is now working. $7 value.
    • Bleep drum version 1
      1) This assembly was in a bad shape. I suppose the kit was used in a class room environment or something, but who ever built the kit got the switch and stereo plug on the wrong side of the PCB and must have abondned the project. 9V battery holder and one of four studs were missing as well. Desoldering those multiple lead components was not a fun at all.
      2) I attached 9V battery and powered it up, hoping the LED will light up. Nothing happened and 78I05 was getting rather hot. Quick check on the output of the voltage regulator indicated something was loading down the VR really bad. Pop out the 8 pin dip and LED started to respond to button pushes. VR out was 5V. Oh, bad IC chip I thought and looked a t the part number on it. This is where real shocker camein. It said TA7015D, which is audio Amplifier. Wait a minute, the schematic I found on the Internet says this should be 4901 DAC! Both are 8 pin DIP IC but was the kit supplied with the wrong IC chip?
      3) So I replaced a chip with 4901. I purchased it from mouser.com when I ordered other parts. Now it seems to be working $50 value?
      4) If the kit was supplied with a wrong chip, then the poor guy who attempted to build it had no chance of this working.
      5) I also feel bad for people who is coming to electronic kit building these days. In my days, components were large. Solder pads were large and solder melting temperature was low due to lead in the solder. It is more difficult to work on PCB soldering even for me who I consider somewhat experienced in soldering.
      6) Bleep Drum is fun!
    • LPC 1768-H blue board
      1) This is a retired Arm cortex board on Sparkfun site. NGX saite is still selling it for $50 or so.
      2) When powered, the test LED was dim and there was no initial booting action where the LED was supposed to blink four times. Scoping the LED output confirmed it was blinking too fast. Somebody must have tried to download a blinky program but with a wrong timer value.
      3) I tried to connect to UART0 with USB-serial cable (using just black-GND, Green-RX0, White-TX0, no connection to red wire) connection after downloading flashmagic. Rebooting while sw press started a bootloader and I was connected. I reinstalled USB secondary bootloader.
      4) Now the USB bootloader started to work. I was able to drag and drop the initial bin file to the board. The board is now reinstated to its original shape. When powered up, LED blinks four times and wait to be programmed.
      5) But I don’t think I keep looking at this board because these days there are so many other options to jump into Arm micro controller more cheaply and easily . I am experimenting with FRDM-KL-25Z with mbed tool chain and its incredibly easy to use. Cypress PSoC now sells $4 board that comes with USB serial interface that can be snapped off for dedicated USB-UART cable afterwards. What a world are we living in?
    • Atmega 328P DIP
      1) Pins were all mangled up so I need to straighten them using a pair of tweezers. Popped into ISP programmer that I hacked with Arduino nano but AVRdude can not read the content. Its either a)broken, b)fuse is configured so can not be programmed without paralell programmer or c)fuse is set to use external crystal.
      2) Out of whim, I popped out the 328p from Arduino uno that I had and placed the 328p in question into Arduino board, loaded the blinky program and on-board LED started to blink. So this must be a 328p with arduino bootloader preloaded. $6 value.
    • More Atmega micro controllers (4 of them)Those are all SMT components. I probably would not be able to use them
    • SC300 wifi module x5
      This looks fantastic but I don’t know how I can use them in this SMT pinouts.
    • Header pins.I received about two dozens of solid header pins. It turns out a perfect fit for my NRI (National Radio Institute) Lab Trainer’s terminal pins which were too loose to connect jumper pins to. So I broke up these header pins to single pins and soldered on top of terminall pins on my trainer. Now the jumper wires slide into it very snuggly. The 35 years old electronics lab trainer regained a new life. Nice.

Will I try the dumpstar again? Maybe I will. The process of troubleshooting seemingly non-working product has some attraction in it.

Raspberry Pi でパソコン電源をInternet上から操作

家の外部からタブレットなりノートパソコンなりを使って自宅のパソコンにリモートアクセスするためのアプリというのは色々ある。Internet経由でアクセスする、というもので、Linuxでは当たり前のように実装されているし、 WindowsでもRemote Desktopというアプリケーションが同梱されているし、ファイアウオールでRemote Desktopが使えない環境でもWebベースのTeamViewer とかlogmeinというサードパーティの製品を使えばセキュアな接続がいとも簡単にできてしまう。 Chromeをブラウザとして使用しているのならChrome remote desktopというアプリが今の旬である。

 なぜそんなことが必要か、という疑問が湧くかもしれないが自分の場合、外部からお気に入りの開発環境にログインし、コード開発を一つのマシン上で行う、という使い方がメインになっている。 もちろん将来的にすべての作業がブラウザ上でできる、という環境が構築されればそんな必要はなくなるわけだが、

問題はパソコンにアクセスするには当然のことながら当該パソコンの電源が入っていなくてはならない、という事。
 エコの観点からみると年がら年中つけっぱなしになっているパソコン、というのはエネルギーの浪費に見える。 WEBサーバーを自宅のパソコンを使って構成していた時には電源をつけっぱなしにするしかなかったのだが、アイドル状態でも常に80Wくらいの消費電力が発生していた。
 現在はCubieboardという、手のひらに収まるサイズのArmcortexの開発ボードをサーバーとして使って賄っており、消費電力は3W以下だ。

で、パソコンの電源を使うときだけ遠隔操作でオンする方法がないか調べてみた。

 InstructableにElectric Impというモジュールを使って電源のオンオフをする方法が紹介されている
このモジュール、SDカードと同じform factorだが、内部にWifiモジュールとArm Coretex M3を内臓したれっきとした開発ボードであって、クラウドサービスに接続してパソコンやタブレット上から専用のコントロールパネルアプリを使って接続されたデバイスのリモートコントロールができるようになっている。

InstructableではこのElectric Impに簡単なトランジスタを追加して、PCのPower switch lineを瞬間的にショート状態にする。(つまりパソコンのスイッチを押したのと同じ状態にする)ことによってPCを起動する方法が述べられている。 Electric Impの値段は25ドル程度だが、サポート用の部品(Imp用のブレークアウトなど)を買い足すと40ドルくらいの出費になりそうだ。
自宅でcubieboardのWEBサーバーを随時動かしているのであえてアカウントを作ってクラウドを使ってコントロールする必要はないわけで、 そうすると似たようなことはArduinoでもできるはずと思うわけだが、これまたArduino本体にWifi、あるいはEthernetシールドを追加すると40ドルくらいの出費になる。 CubieBoardのGPIOをパソコンのスイッチに接続して操作することも可能だろうが、部屋が2階と地下室に分かれているし、メインサーバーになっているカードのGPIOで他のデバイスをハードウエアコントロールというのは安全性の面から心理的抵抗がある。

そこで遊び終わって引出しに眠っていたRaspberry Piを使うことにした。Desktop用のLinuxが走るほどのグラフィック性能を持つボードをただの電源スイッチとして使う、というといかにももったいない感じがするのではあるが Piの値段も含めて40ドルくらいで済んでしまうのでコストパーフォマンスの面から考えると他の方法に比べても高くはない、というか他の手間を考えるとこちらのほうが安上がりの感じ。

調べてみるとデバイス制御をPythonベースのhttp サーバーから実行できるWEBIOPIというPi用のライブラリーを発見した。 これをインストールするとGETとかPOSTのHTTP用のプロトコルを使ったRESTという手法でハードウエアのコントロールができるようになる。 つまりWEBサーバー上にページを作り、そのページ上にボタンを描画して、WEBIOPIで提供されているRESTコールを紐つけるという方法でPiのGPIOピンの遠隔操作ができるようになる。 このRESTという手法、非常に単純で、urlのパスに模してパラメーターをサーバーに送ってあげるというもの。GETはアドレスをブラウザで指定するだけで実行できるのでたとえば APIですべてのGPIOの状況を取得するAPIを使うには webiopiをバックグラウンドで走らせている状態で、

https://example.com/GPIO/*

とアドレスをブラウザに打ち込むだけで、Jason書式でGPIOの各ピンの状況が返ってくる。 ただし、これではページの表示自体がJasonのレスポンスになるので実用的ではなく、実際にはJavaScriptでコードを書くことになるが、webiopiにはうwebiopi.jsというヘルパーファイルが同梱されているので、使う難易度は低くなっている。

GPIOの使い方だが、
出力用に設定したGPIOピンをトランジスタを介してパソコンの電源スイッチとパラレルに接続し、パルス上の信号を出力してやるとパワースイッチを押したのと同様のことになり電源が立ち上がる。(電源が入っているときには逆に電源が落ちる)。電源スイッチへ接続されるピンはパソコンのマザーボード上のフロントパネルコネクター部分(パソコンケースのケーブル類を接続するコネクタ部分)に接続ピンがあるのでワイヤーをスプライスしてつなげてやればよい。。
また信号を出す前にパソコンの電源が入っているかどうかをわかっている必要があるのだが、フロントパネルコネクターには電源表示用のLEDへ接続されるピンも存在している。 そこでこのピンをGPIOでモニターすることによってパソコンに電源が入っているかどうかの判定をすることにした。

実際に組んだ回路。使ったGPIOピンは25をパワースイッチ用の出力に、24をLED電圧モニター用の入力にそれぞれ使用。 IntelのPC Interface 仕様(下に抜粋を載せます)を読む限り、パワースイッチ端子はトランジスタに直接接続(PWR+をコレクタ側に、PWR-をEmitter側に)しても大丈夫と思うが、5Vの小型リレーがたまたま手元にあったので使ってみた。NPNトランジスタのかわりに2N7000のようなFETを使えば、R1は必要ない。入力ピンのほうはLEDのVfでクランプされる電圧になるので規定の3.3V以下。万が一LEDがオープンとなっ場合5Vかかってしまうが、GPIOには保護用のクランプダイオードくらいはいっているのだろうと勝手に思い込んでいるので,保険は電流制限のR2のみ。

Table 5. Switch/LED Front Panel Electrical Connection

Pin Signal Description
2 FP PWR/SLP MSG LED pull-up (330 ohm) to +5 V
6 PWR_SW_P Power Switch high reference pull-up (10000 ohm) to +5 V
8 PWR_SW_N Power Switch Low reference pull-down (100 ohm) to GND

贅沢の極み?

贅沢の極み?


html pageの記述


<!DOCTYPE html>
<html lang="en">
<head>
<base href="https://example.com/" />
<title>PC power </title>
<!--[if IE]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
</head>

<body>
    <h2>Turn On Basement PC</h2>
    
パソコンの電源操作ボタンでやんす。!
<form class="buttonBar"></form>

<script type="text/javascript" src="//code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript" src="poweronbutton.js"></script>
</body>
</html>

参照されているJavascriptの記述

/**
 * Created on 5/4/14.
 * poweronbutton.js となっているが、実際にはGPIOのモニターも行う総括的なコード
 * powerbutton element id='pb'
 * html form tag class = buttonBar.
 * GPIO #25 connected to 1n2222 which drives spdp relay to momentariry close power switch.
 * PC power switch is momentary switch.  if PC is off, it will turn on PC.  if PC is on, it will turn off pc
 * relay connected to power connections of PC system panel terminals.
 * GPIO24 connected to Power LED terminal.
 * webiopi (python httms and coap server) installed on target raspberry pi
 *
 */
function setupGPIO(){   // set GPIO25 to out for pc power switch connection.
                        // and  GPIO24 to in  for monitoring PC power LED terminal status
    $.post( 'https://example.com/GPIO/24/function/in',
        function(data) {
            if (data==='IN')setTimeout(monitorPower(),1000);
                  });
    $.post( 'https://example.com/GPIO/25/function/out',
        function(data) {
            data =(data=='OUT')?'PC Power':'setup failed';
            $('#pb').attr("value",data);

        });
}

// }
function turnon(){ // RET command to output pulse
    $.post(
        'https://example.com/GPIO/25/sequence/1000,010',
        function(data) {
            data=(data==0)?'Power switch pushed':'NG';
            $('#pb').attr("value",data); }

    );
}
function monitorPower(){//monitor GPIO 24 status every one second
    $.get('https://example.com/GPIO/24/value',
        function(data){
            data= (data==='0')?'PC is OFF':'PC is ON';
            $('#powerstatus').html(data);
    setTimeout(monitorPower(),1000); //call myself every 1second

})

}
$(function(){
    $('<input type="button" class="power" id="pb" />')
        .appendTo('.buttonBar')
        .attr("value", "Initializing")
        .attr("title", "Turn on Somethin'")
        .click(function () {
            turnon();
        });
    $('<div></div>')
        .appendTo('.buttonBar')
        .attr('id','powerstatus');
      setupGPIO();
    }
);

ターゲットのRaspberry Piにwebiopiが導入され起動されていることが前提になる。 また、上の方法では同梱されてくるwebiopi.jsは使わずに自前のJavaScriptでREST APIを直接アクセスしている。

ページの仕組み:
ブラウザーがページを読み込み終わった時点で、上のjavascriptが以下の作業を実行する。
ボタンを描画し、ボタンのラベルを”Initializing” と表示する。
GPIO25を出力ピンに設定。 ボタンのラベルを”PC Power”と書き換え、ボタンのクリック動作にパルスを送信するRESTコマンドを紐つける。
GPIO24を入力ピンに設定。同時に入力ピンの1秒ごとのモニターをスタート。WEBIOPIからRESTで返された状況に応じてページ上に”Power is ON” または ”Power is OFF”を一秒ごとに更新表示

JavaScriptの部分はRefactoringやnamespacing をやっていないので改善の余地あり。またPower LEDのモニターだけではパソコンがオンしていることはわかっても、実際にWindowsが立ち上がっているかどうかはわからないので、何らかのインターネットサービスをPi側からモニターする手法を併用するほうがよさそうだし、CSSの記述も追加してページの見栄えもよくしたいと思うが、一応初期の目的はこれにて達成。

なお、WEBIOPI自体にログイン形式のセキュリティ機能が実装されており、ページの最初のロード時にログインネームとパスワードを聞いてくる仕組みになっている。ログインとパスワードの初期値がそれぞれ”webiopi” と”raspberry” となっているので、マニュアルの手順に従って変更しておく必要がある。

また、Raspberry Piへの電源だが、パソコンの電源に5V standbyが存在しているため、ここから引き込んでいる。24p/20pコネクタの紫の線だが、マザーボードの電源側への要求スペックが500mAで電源側の仕様が2Aなので余裕のようだ。Raspberry PiもPCの筐体に入れてしまったので見た目もすっきりである。

<後記> 電力消費計を入手したので、実際のところ、どれだけエコになっているのか測定してみた。 パソコンを普通に電源投入すると80Wくらの消費になっていた。 パソコンをオフにすると7Wだ。パソコン用の電源が動いていて5Vのスタンバイ電源からPiとその他に供給しているということだ。 その差73Wだが、電気代で考えるとまったくパソコンをオンしなかった場合、年間約50ドルちょっとの節約になる。パソコンの稼働率が10パーセントくらいと仮定すると45ドルの節約なので1年でもとが取れる計算になる。

PIC マイコンライターを入手したので….

30年ほど遅れたがPICマイコンのことを調べてみようと思った。

入門用に使ってみようと思うPICマイコン、資料を見ると16F84というのが盛んに議論されているが、Microchipのホームページをみてもこのマイコンはリストアップされていない。型番が古いためのようで、Gooligum Electronicsのサイトによれば、最近のPICマイコンのラインアップでさらに性能が向上し、かつ安価で入手性が良いのは以下のようなものになるらしい。

性能によって 4つのファミリーに分けられる。
BaseLine :12ビット命令系 割り込みがないなど制限があるが単純で使いやすいとのこと。 10F200(6端子)12F509(8端子)、16F506(14端子) など
Mid-Range: 14ビット命令系 BaseLineの拡張版で割り込み制御、メモリーの増設PWM、モーターコントロール、I2C,SPI I/F やLCDコントロールなどの周辺回路の追加、、 12F629(8端子) 16F690(20端子) 16F887(40端子)など. このシリーズが16F84の系統らしい。
Enhanced Mid-range:14ビット命令系 Mid-rangeの拡張版でさらなるメモリーの追加、命令群の増設、Cコンパイラ用に最適化したメモリーアクセス手順、改善された実行速度など 12F1501(8端子)、 16F8124(14端子)、16F1946(64端子)など
High End : 16ビット命令系 いわゆる18Fシリーズ 周辺回路にUSB,Ethernet、CANとの接続性が追加され、メモリーもプログラムは128Kまで、データも4Kまで対応 18F1220(18端子)、18F2455(28端子)、18F8520(80端子) など
ややこしいのは、これらのマイコン、インストラクションは12~16ビットの幅があるが扱うデータが8ビットなのですべて8ビットマイコンだということ。

Mouser.comで値段をみると 12F509-I/P $0.85、12F629-I/P $1.10 、12F1501-I/P $0.92 (すべて8端子)ということで、 BaselineとEnhanced Mid-rangeとでは値段に差がない。 それならよりパワフルらしい12F1501をベースに勉強してみようかと思ったのだが、 データシートの最初の数ページを読んで挫折した、というか 勉強するのをやめた。
何故か。
PICマイコンはプログラム領域とデータ領域が別に取ってある。 プログラム領域は連続しているのだが、データ領域は128本の8ビットデータレジスタ(ファイルレジスタ)を一つのバンクとして、最大32のバンクを切り替えて使うようになっているらしい。 ただし同じデータをどのバンクでもアクセスできるようにいくつかのレジスタは同一レジスタへのアクセスなのだ。(たとえばバンク切り替え指定のレジスタなど) AVRに比べると煩雑な感じである。 それなりの理由があってこうなっているのだろうが、 これはもういけません。 自分の頭脳がこの先を読むのを拒否しております。

というわけでPICマイコンの勉強はしばらくおあずけ。

Arduino でAVR マイコンのプログラム

前回、手持ちのArduino MicroでAVRマイコンのライターを作成したので、それを使ってAVRマイコンをプログラムしてみる。

用意したのはAtmega168Aという28ピンのチップ。 買った状態では内部発振の1Mhzで動くようになっている。内部発振では1Mhzと8Mhzを選択できる。ちなみにArduino Unoは同系列の328P

まずは手始めにArduinoのIDEを使ってArduinoのスケッチを書き、コンパイルさせてAVRチップにアップロードしてみる。手順さえ間違わなければ これでちゃんと動作してしまうんである。

168AVRのチップのピン配列(PortB,PortC,PortD etc.,) と Arduino式の(D0~D13,A0~A5) ピン配列の関係についてはここにマッピング情報がある。 LEDのBlinkスケッチを使う場合、LEDを接続するD13に該当する出力ピンはPB5である、ということがわかる。

蛇足ながら、PB6とPB7はArduinoボードではクリスタルに接続されているために入出力ピンとしては使えないが168を内部発振で使う場合には使用可能、ただしDigitalPinの定義がないので、Cに落とした記述が必要。

IDEのメニューからTarget Board を選ばなければならいないが、当然のことながらAtmega168などという選択肢はない。ので、Arduino Pro Mini(with 8Mhz Atmega168)というのを代わりに選ぶ。

ただし、AtMega168は工場出荷時の内部クロックは1Mhzに既定値設定されている(内部発振8Mhzを8分割) 上記のBoard 選択では8Mhz 用にコンパイラがタイミングループを調整するので1秒の点滅を指定すると8秒の点滅になる。 これが嫌ならAVRDUDEを使ってAtmegaのFuseを書き換え内部クロックを8Mhzに設定するか、または Arduino/hardware/arduino/boards.txt にならって1Mhz のAtmega168をバリエーションとして追加してあげる必要がある。
8Mhzに設定するにはAVRDUDEを使ってフューズ設定を書き換えることになる。

C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avrdude.exe-c arduino -p atmega168 -P com5 -U lfuse:w:0xe2:m

Boards.txtへのアイテムの追加はこの記事が参考になる。

Arduino IDEではShiftキーを押しながらアップロードボタンをクリックするとUSBに接続されているライターを使ってターゲットBoard(Arduinoまたはマイコンチップ)にコードをアップロードしてくれる仕組みになっているが、このためにはToolメニューの中からプログラマを指定する必要がある。Arduino Unoをライターとして使う場合は”Arduino as ISP” という項目を選べばよいのだが、自分が使っているArduino Micro はこれでは動作してくれない。(Leonardでも同様) この設定はArduino/hardware/arduino/programmers.txtというファイルにあるが、Unoに指定の

Arduinoisp.protocol=stk500v1

ではうまくリセットがかからないようだ。以下のようにこのprogrammers.txt にMicro/leonard 専用の選択肢を追加してIDEを再起動し解決

arduinoisp.name=Arduino Micro or Leo as ISP
arduinoisp.communication=serial
arduinoisp.protocol=arduino
arduinoisp.speed=19200

これで、Atmega168のPB5にLEDを接続し、BlinkスケッチをダウンロードするとLEDが点滅を始める。

Arduinoを使うと豊富なライブラリーが使えるという利点があり、ATtinyをArduino IDEでプログラムしようというプロジェクトもあって資料も豊富だ。

欠点としては

1.ターゲット用にBoards.txt項目を追加する必要がある。 ただし、一度の作業。

2.Arduino IDEの使い心地。 これは個人的な嗜好の問題だがAVR用にC/C++をコーディングするのならArduino IDEよりも強力な無料のIDE (Eclipse with AVR  plugin [Linux, Windows],   AtmelStudio [Windows])が存在する。

突然我が家にPICプログラマ(ライター)がやってきた。

近所で立ち寄れる電子部品を扱う店がRadioShack以外はほとんど壊滅状態になった今日この頃、米国で電子工作に使う部品とか工具を入手しようとすると通信販売に頼るのが普通だろう。 ざっとあげてみるだけでも、ICなどの電子部品はDigikey.comかMouser.com 。
この二社は工場で使うような大口注文からホビースト向けにICのばら売りまでこなしてくれるので重宝する。スイッチとかモーターなどはallelectronics.com。あとはAmazonをみれば大体なんでも入手できる感じ。 またHobbyist専用のキットやSMTのセンサー部品などを扱いやすいように小さな配線板にモジュール的に実装した製品などはadafruit.comやSparkfun.comなどが品揃えも豊富かつ対応が早い。 少し時間がかかるのを覚悟すれば中国からSeeedstudioなども使える。

で、やっとこさ本題に入るが、Sparkfun.comでは年に1度か2度の頻度で梱包があいているものとか、傷不良、旧製品などの半端ものの処分をする。 形式としては、縦横15cm、奥行き20cmくらいの箱に雑多な製品や売れ残り品を詰め込み、福袋のようにして(この場合は福箱か) Dumpster Dive と銘打って売り出す。 数量的には100個くらいのようで、インターネットで時間を決めてよーいドンで始めると2分くらいで完売する。

ところでDumpster Diveという言葉だが、 dumpsterというのは路地の裏側などに置いてある大きなゴミ箱のことである。 このゴミ箱を漁ろうとするとよじ登って入り込み、それこそ潜って物色するような感じになる。 乞食や浮浪者だけではなく、大きな食料品店やレストランのdumpsterは普通に食せるものが平気で捨てられている、ということで、Dumpster Diveの愛好者グループも存在する由である。

そんなところからSparkfunのサイトでも何が入っているかわからないよ、ということでDumpster Diveと銘打ったイベントになっている。

今回、クリックしてみたら運よく購入することができた。 $10プラス送料で一体何が送られてくるか楽しみにしていたのだが、 送ってきたものを開けてみれば想像以上の収穫だった。

  1. CanaKit USB PIC Programmer: Microchip純正 PICKIT2 と完全互換の PICマイコン用プログラマ。まともに購入すると販売価格60ドルくらいである。Firmware 更新用のボタンスイッチの上部がとれていたが、マイコンのプログラムには全く支障がないことを手持ちのPIC18F2550で確認。ボタンも手持ちの押しボタンスイッチに半田付け交換し、完全復帰。PICKIT2と違ってICPの他に40ピンのZIFソケットも付いているのでDIPマイコンを直接焼くことができる。
  2. PCduino: Allwinner A10を実装したArduinoとピンコンパチのArmCortex Development board. これまたMotorolaのLapdockに接続し、内臓2GBフラッシュからLubuntuが立ち上がることを確認。 wifi内臓+Arduinoシールド互換のPcduino2が出たので、Sparkfunはpcduinoの扱いをやめ、旧品在庫として処理したらしい。 これもまともに買えば50ドル以上はしそうだ。
  3. FTDI USB シリアル コンバーター: このブレークアウトほしかったんだよね。上のPcduinoにも実装されているDebug用のシリアルピンに接続するにぴったりではないか。 小売価格15ドル
  4. I2C対応室外用ソーナーモジュール X2 : 1個90ドルくらいするはずなのだが、車載用のバックアップウオーニングか自立歩行ロボットでも作りますか?
  5. 車両Diagnostic Kit: 車両のダイアグコネクタに接続して車両情報を読み取るためのモジュール。コネクタケーブル付き。やはり普通に買うと60ドルくらいする。
  6. 電解コンデンサーが山ほど。
  7. コンパレーターIC,A/DコンバーターIC、Opt Interrupter、ギャップセンサーICがそれぞれ一個づつ.
  8. Banana plug端子が半ダースほど
  9. USBのBlueToothドングル一個
  10. Stepper motor のドライバーボード、6枚続きのアレー状態が一枚。これをうまく切り離すことができれば使えそうだが、手持ちのロータリーツールで破損させずに切断できるかな。
  11. 3ピンロータリーエンコーダ

小売価格としては恐らく300ドル以上は行っている。たまたま当たりだったのか、いつもこんなものなのか、こういうセールがあればまたチャレンジしてみたいと思った次第。

一番嬉しかった(困った?)のはPICプログラマである。 前にも書いたがPICマイコン始めてみたいと思っていたのだが専用プログラマが高いので遠慮していた。それが入手できたのでもう言い訳ができなくなってしまったわけだけれど、今、AVRマイコンの学習も佳境に入っているところだ。 週末の日数が足りないよ..

Arduino でAVRプログラムライター

先回、ArduinoのIDEに同梱されているスケッチでAVRプログラマを作成できると知識だけで(無責任に)書いたのだが、本当にできるんだろうね、と検証してみたので結果を書いておく。

結果  できました。

前置き:
ATMELのサイトを眺めてみると、もっとも安価でかつポピュラーな純正プログラムライターはATMEL AVRISP MK2 なるものだが、価格は、とみると$34となっている。 本格的に開発に使おうとするならAVRDragonというのが良さげだが、これが$49.

MK2はArduino Unoの値段とほぼ同じ。 またAdaFruit.com でAVRプログラマシールドなるものを売っているが、シールドにZifソケットや328Pチップをつけてくれているとは言え、$17. これにArduinoを購入することになるので$50くらいの出費になる。これまたAVRDragonとほぼ同じ値段。

Arduino Proとか$10くらいの廉価品を買ってきてセットアップすれば本格的なライターより安くは組めるだろうが同じくらいの出費をするなら専用ライターを買ったほうが良いに決まっている。(Atmel Studioという統合型のIDEでデバッグなどにそのまま使える) Arduinoを使ってAVRプログラマを作成するというのはどこかに使っていないArduinoが転がっていて、かつAVRとC(++)をちょっと試してみようか、という状況ならともかく、普通はなるべく安いライターを探すことをまず考えるだろう。ま、arduinoを使えば、AVRに挫折したときに改めてArduinoとして再利用できる、という利点はある。実はAvrdudeを使えばプリンタ用のパラレルポートから直接ワイヤーを配線してAVRマイコンをプログラムすることが可能(つまりライターすらいらないの)だそうだが、最近のパソコンではパラレルポートなど実装していない。 (追記:amazon.comで$6のUSB ISPプログラマを売っているのを見つけた。現在のところこれが最安値)

本文
で、自分の場合、うっかり買ってしまったArduino Microという小さなArduino boardが手元に転がっていた。 そこで、このArduino Microに Arduino IDEのメニューのSampleの中から”Arduino ISP”というサンプルスケッチをアップロードし、このプログラムの中に書いてある通りにブレッドボードに配策し、試してみても動かない。

延べ4時間くらい、はまってしまったのだが、ネットを調べて最終的にはマイコンチップをプログラムできるようになった。 要点をかいつまんで書いておく。
1.Arduino MicroはArduino Leonardと同じく32u4というマイコンチップを使っている。 従前のArduinoが使っていたAtmega328Pというチップではない。このため、DigitalPinに対する入出力ポートの割り付けが従来とは異なっている。
2.このため、上記のスケッチで #define RESET SS となっている部分はUnoなどではPin10があてがわれるが、マイクロとLeonardではPin17に定義されている。 このPin17、RX_LEDへと接続されてしまっているので、上の表記は #define RESET 10 とPin 10に明示的に変更してやる必要がある。
3.同じようにSPI用のピン3本(MOSI,MISO,SCK) スケッチ上のコメントでは11,12,13の3つの出力に接続するような指示になっているが、Micro (Leonardも)の場合、SPIはこれらのピンにはマッピングされていない。幸いなことにMicroの場合、MOSI,MISO,SCKの3本がヘッダーピン配列に物理的に存在しているので、ここに接続してやることになる。(Leonardの場合はUnoと同じヘッダーピン配置というのが災い?してこれらのピンは存在しないので、ICP用の6本ピンヘッダーの当該PINにそれぞれ接続することになる。(ただし、ResetはPin10に接続)

回路図的にはこんな感じ。

Arduino Micro as AVRISP

Arduino Micro as AVRISP ダブルクリックで大きな図を見る

実際のブレッドボードへの配策はこんな感じ。

AVR ISP using Arduino Micro (at left)

AVR ISP using Arduino Micro (at left)左のArduinoMicroで右のATmega168をプログラムする図

手順だけ羅列すると
1.Arduino のSample sketchからArduino ISP をIDEに読み込み、#define reset SS を #define reset 10と書き換える。
2.”Arduino as ISP”スケッチをArduino Microにアップロード
3.上のようにワイヤを配策。LED3点については無くてもOK(だがあると恰好よい)
4.CファイルをAVR-GCCでコンパイルし、生成できたHEXファイルをAVRDUDEを使ってアップロード, あるいはArduino IDEでスケッチを作成、sift-Uploadでターゲットをプログラム。(この部分の説明は記事を改めていずれそのうち)

Arduino とは何か

今まで何度も取り上げていて、いまさら何かと切り出すのもなんだが、一度整理しておく。
はじめてArduinoのをみたのはおそらく2010年の年末だ、なんと近所のRadio Shackで入門本と一緒に売っていた。 (RadioShackが昔のように、電子工作の小物を置くようになったというのは非常にうれしいことである。最近はRaspberry PiとかBeaglebone Blackの入門キットも売っている。 閑話休題)
BasicStampに比べると値段が手ごろだったので購入したのだが、このときの解釈は Arduino = 開発ボード

しかし、入門本を読み、LEDの点灯を試み、サーボモーターやリレーの操作、さらには16×2ケタのLCDを表示するという一応のイニシエーションを行ったあと、改めて眺めてみれば、Arduino というのは開発ボード(だけ)ではなかった。

ボードを購入したあと、ユーザーはArduinoのサイトから開発環境をダウンロードしてプログラミングすることになる。 このときSketchという言語でプログラムを書くのだが、これはWiringという言語がもとになっている。 そしてWiringもSketchも基本的にはC言語を使ったFrameWorkだ。

IDEのGUIはJavaでできているものの、そのバックグランドで動いているものはAVRマイコン用に特化したGCC(AVR-GCC)であり、AVRDUDE(AVR Downloader/UploaDEr) という、マイコンプログラムの先人達によって鍛えられたAVRマイコン用のTool chainである。

ではArduino環境は従来のマイコン開発環境と比べると何が違うのか。
-ハードもソフトもできる限りのアブストラクト化がなされている。
という一点につきる。 AVR8はportB,C,D それぞれ8ビットが入出力になっており、本来のATMEL のC言語の操作ではこれらのポートレジスターにビット操作での書き込みをおこなっていた、つまりPortBの ビット0とか6とかを気にしてコーディングしていくのだが、 アブストラクション(抽象化)を行った結果、 ArduinoのユーザーはDigital pin 0~13, Analog input pin 0~5 という入出力ピンの操作だけを考えればよいようになっている。
スケッチもSetup()という初期化ルーチンとloop()という繰り返しルーチンを書けば、あとはTool chainがコンパイルし、プログラムをアップロードしてくれる。 このからくりはArduino のプログラムフォルダー(自分のWindows環境ではC:\Program Files (x86)\Arduino\hardware\arduino\cores\arduino)の中のmain.cppを眺めてみるとなんとなく見えてくる。

#include <Arduino.h>

int main(void)
{
	init();

#if defined(USBCON)
	USBDevice.attach();
#endif
	
	setup();
    
	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        
	return 0;
}

何故にwhileを使わず、for(;;) という構文を使っているのか、という疑問はさておき、Arduino のスケッチはこの上のmain.cppに組み込まれるsetup()とloop()関数を定義しているというわけで実際にコンパイルされるのはC++のソースだった。

Arduinoでは多くの周辺デバイスとのインターフェース、通信プロトコルなどはすでにライブラリーで提供されている。 またArduino自体にマイコンチップをプログラムできるような周辺回路およびブートローダーが組み込んてあるからチップにコードを焼くための専用プログラマが必要ない。

下のコードは、入門本で一番最初に出てくるLEDを点滅させるためのスケッチコード

int led = 13;
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
}

void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);               // wait for a second
}

ところがArduinoのIDEがインストールされたPC環境ではすでに上に述べたようにGCCとかtoolchainとかが導入済みになっているため、 以下のようなプログラムををCで書いて、コマンドラインを使ってコンパイルし、Arduinoへ書き込みをすることが可能になっている。 下のコードでやっているのは上 のスケッチと同じくPin 13を点滅させることだが、ArduinoスケッチのProgramがコンパイルしてアップロードするサイズが1000バイト以上あるのに対し、下のプログラムは200バイト以下になる。abstractionの代償はプログラムのサイズということらしい。


#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

#define LED      PB5
#define LED_DDR  DDRB
#define LED_PORT PORTB
#define DELAYTIME 500 //delay 500ms. See _delay_ms definition

#define setBit(sfr, bit)     (_SFR_BYTE(sfr) |= (1 << bit))
#define clearBit(sfr, bit)   (_SFR_BYTE(sfr) &= ~(1 << bit))
#define toggleBit(sfr, bit)  (_SFR_BYTE(sfr) ^= (1 << bit))
long i;
int main(void)
{
    // setup()
    setBit(LED_DDR, LED);                      /* set LED pin for output */

    // loop()
    while (1) {

	    setBit(LED_PORT, LED);
	    _delay_ms(DELAYTIME);
	    clearBit(LED_PORT, LED);
		_delay_ms(DELAYTIME);
	    
    }
}

while分がArduinoスケッチのloop()に相当し、その上がsetup()に相当する。
上をblink.c というファイル名で保存し、Arduinoがつながった状態でコマンドラインから以下を実行するとLEDの点滅を始める。(もちろんserial portによってCom5部分は異なる)

>avr-gcc -Os -mmcu=atmega328p blink.c -o blink.o
>avr-objcopy -O ihex blink.o blink.hex
>avrdude -p atmega328p -c arduino -P com5 -U flash:w:blink.hex:i

コマンドライン3行をターミナルモードで打ち込むわけだが、Batch file にしてもよい。その実行はarduinoのアップロード機能を使うのに比べて恐ろしく早い、ということも実感できると思う。
Arduinoを使うのは野球のグローブをつけて裁縫をやるようなものだ、とかなんとか言った人がいる。 抽象化が過ぎてマイコンをプログラムしている気がしない、ということで、たしかに熟練者の目からみればもっともな話かもしれないが、Arduinoの一番の目的はマイコン学習を始めるための第一歩を容易にすることにある。(と思う) 豊富なサンプルコードやライブラリーを見るとその楽ちんさは尋常ではない。ハードとソフトの両方への入門が可能な環境になっている。 ずうっとArduinoとスケッチでいいじゃない、十分だよ、という気にもなってくる。 それにArduino IDEのサンプルメニューを眺めているとわかるが、Arduino自体をAVRマイコンのプログラマにしてしまうスケッチがご丁寧に同梱されている。 Arduinoにものたりなくなってきたら、(入出力が6本以下のマイコンでできることを、何が悲しゅうて28ピンのマイコンプラス不要な回路を載せたボードでやってまんねん、自分はミニマリスト的なアプローチがすきやねんとか思いはじめたら)ATtinyのチップだけ100円で購入してArduinoを使ってプログラムを焼くことも可能になっているわけだ。

PICAXE -Basicで動かすマイクロコントローラ

20年以上前になるがBasicStampというベーシックで動かせるマイクロコントローラーが世の中に出てきた。(今でも健在) それなりに興味があったわけだけれど、始めるのに100ドルくらいはかかりそうだったので、それがバリアになり、手を出さずにいた。 PICマイコンというのが世の中に出回り始め, Basic StampというのはこのPICをベースにしたBasic 内蔵のボードだったわけで、 面白そうだったけれど開発環境を作るのが面倒くさそうで手を出さずにいた。
そのうちAVRマイコンを使ったArduinoが開発され、これは30ドルのボードを買ってきて手持ちのパソコンにつなげればすぐに開発が始められるという手軽さ。 多くの電子工作入門者、あるいはメーカーと呼ばれる人々はArduinoでこの世界に足を踏み入れた、というのが現在の状況だと思う。
今回、ひょんなことからPICAXEというチップの存在を知った。PICベースでBASICを内蔵させた開発環境だという。一番小さな8ピンのPIXACE08M2というのがsparkfunで購入して一個$2.95.プログラミングに必要な3.5ミリのステレオジャックを含んだプロトキットが4ドル。 一番高いのがパソコンに接続するためのUSB/シリアルの変換ケーブルで、これが25ドルしているのだが、Sparkfunのオリジナルで15ドルのUSB Programmer が代用できる(ただし、別途ステレオプラグケーブルが必要) というわけで入門価格として
PICAXE 08M2 X 2 = $5.90
PROTOKIT X 1 = $3.95
PROGRAMMER X 1 =$14.95
ステレオプラグケーブル:手持ち品を流用
USB – MINI USB CABLE 手持ち品を流用
5v 電源 手持ち品を流用
送料 $6.00
合計$30.80 となり、 価格バリアもクリア  したので購入し、試してみた。

開発環境はPICAXE のホームサイトからダウンロードできる。 オリジナルのpicaxeは4mHZで動いていたようだが、最新のM2シリーズは32MHzと高速になっている ただし、普通に動かすとBasicは4Mhzで動作し、疑似的に4本までの並列処理が可能になる。

8ピンのチップと言っても電源とグランド以外のピンは6本とも入出力ピンに使えるし、PWM出力やアナログ入力もこなせる。なかなか使い勝手のよさそうなチップである。 ピンの出力も20mAまでOKなのでArduinoと同等だ。

LEDを点滅させるプログラムは以下のようになる。

main:
high c.1
pause 500
low c.1
pause 500
goto main

昔なつかしのBASIC言語である。 いまとなってはGoto文が新鮮に見える。 プログラム用のメモリーは2048byteあるが、Tokenizeされてチップ上にアップロードされる上のコードは14バイトにおさまる。

これで出力ピンにLEDと抵抗を直列に接続すれば、1秒ごとに点滅するLED回路となるわけだが、 32Mhzで動かした場合、どれくらいの速さで出力ピンを操作できるのか試してみた。 最初のコマンドでBasic を8倍速させている。

setfreq m32
main:
high c.1
low c.1
goto main

これでC.1のピン波形をとらえたのが以下

Manupulate picaxe pin

PICAXEピン出力

 

Hi出力の幅が36マイクロ秒に対し、Lo出力の幅は126マイクロ秒, 周波数6.156Kということになる。Hi,の出力にくらべてLowの出力が長いのは、gotoコマンドの実行に時間がかかっている、ということだろうが、 32Mhzのマシンサイクルに対して出力できたのが6Khz。 Basic Interpreterで動作させることのオーバーヘッドがいかに大きいかがわかる。 ちなみにPICAXEのサイトでは1秒間に実行できるBASIC命令文は約4000と説明されている。

実際にいたずらするには問題のない実行時間だと思う。 さらに、もっと細かいパルスを出力するためのServo や 内蔵PWM出力用のコマンド、あるいは可聴域信号を発生するためのtune コマンドなどが別に用意されているから、パワフルなマイコンであることに変わりはないが


Pause 1

できっちり1ミリ秒遅らせられるわけではない、ということがわかる。

それにしても、何度もいうけど電子工作するのに本当に便利な世の中になったもんだ。

beaglebone black GPIO ピンの謎

GPIOというのはGeneral Programmable IOという意味でつまりは、用途に合わせて設定できる入出力ピンということだ。 ソフトウエアで設定すれば入力ピンにも出力ピンにもなるという便利もので、40年前に電気工学を勉強した自分にとっては夢みたいなハードウエアなのだ。
BeagleboneBlackにはこのGPIOピンが69pinも用意されている。(とはいうもののHDMIとeMMC support用にリザーブされているピンもあるので全部が即使える、というわけではない. それでも30本以上はありそうだ) デジタル入出力のほかにもアナログ入力や出力に使えるピンも何本か用意されている。

ただ、出力ピンにした場合、その出力電流はソースで4ミリアンペア、シンクで6ミリアンペアとなっており、それほど大きな電流が流せるわけではない。 ちなみにArduino は 各ピン20mA、ピントータルで400mA。 Derek Molloy さんのyoutube ビデオでは、これを鑑み、LEDを点灯させるのに小さなトランジスタをかましている。(http://www.youtube.com/watch?v=wui_wU1AeQc)

これが正解だと思うのだが、 Adafruitのサイトのチュートリアルでは初心者を考えたのか、トランジスタを省略し、470オームの抵抗をLEDに直列にいれて、これを直接駆動している。 あのSimon Monk氏が書いているTutorialで、470オーム以下の抵抗値は使わないように、という指示がある。 この場合、 普通に売っているLEDのフォワード電圧が20mA通電時で1.85V~2.5Vと考えると(3.3-2.0)/470~(3.3-1.85)/470=1.7mA~3.08mA. 一応4mA以下となるので、OKということらしい。写真を見ると、これでも結構明るく点灯している。

最近みたこのサイトの場合はもっと過激で、50~100オームの抵抗を指定している。 (ちなみに作者はMaker: からRaspberry PiやBBBの入門書も出版していて、ちらっと見た限りではこの書籍の中でも100オームを指定していた。)
100オームを使った場合だと、電流量は 最悪 12mA程度になる。 50オームだとその倍で、20mAになる。さらに、100オームの場合だとフォワード電圧が飽和しないので、実際には12mA以上になるはずで、当然ICメーカーの指定仕様は超えている。 平気なのか、と思うが、実際に数分だけやってみたところ平気だった(おい) ただし、これはTIのチップの設計および現物が仕様に対してマージンを持っている、ということで、、LED1個点灯くらいならまだしも複数個点灯させるのはやはりまずいだろ。

20年前の電気屋の頭でLEDには20mAとはいかなくてもその半分くらいは流したいとおもっっているので、出力ピンにはNPNトランジスタをかませる、というのが、今の自分の結論。

3者三様、LEDの点灯回路

3者三様、LEDの点灯回路

driving-led2

Circuitlab のDCシュミレーションでの計算値。

boneScriptで遊ぶ

Beagleboneblackを電子工作用にリザーブしたので、Angrstrom Linux についてくるbonescriptで遊んでみた。(Debian wheezyのイメージになっていたeMMCにAngstromの最新イメージを改めて焼き直した。) 普通javascriptといえばWEBクライエント用のプログラム言語だし、 C++やJavaなどいじっているプロの方から見るとToy Lanuguageなどとバカにされがちだけれど、自分のような日曜プログラマにとっては非常に重宝するtool なんである。 boneScriptは、このjavascriptをサーバー側で使えるようにしたnode.jsというプログラム上で走る。 BBBのハードウエアをJavaScriptの文法で操作してしまおうという優れものだ。 node.js は一般的にはwebサイトのサーバー側を能動的に管理するような形で使われるのだと思うけれど、boneScriptと組み合わせるとPC上のプログラミング言語として機能する。

JavaScriptの特徴としてプログラムの非同期実行ということがあげられる。jQueryの使い方で一度はまったことがあって、 関数によっては前に呼び出して得たreturn情報を次のステートメントで使うためにはちょっと待てという感じでプログラムの流れをブロッキングするかコールバック処理を使う必要がある。 逆に言えばコールバックを使ってのイベント処理には力を発揮する。

その特徴を使って以下のようなbonescriptをいたずら書きしてみた。BBBに実装されている4つのLEDをてんでバラバラに明滅させる、というだけのプログラム。

//#!/usr/bin/node
//uncomment the above line and chmod +x  to make it shell executable.
//This program will randomly turn on/off four on board LEDs.
// 11/28/2013
//setup()
  var b = require('bonescript');
  var LEDs=['USR0','USR1','USR2','USR3'];
  for (var i=0; i < LEDs.length;i++) b.pinMode(LEDs[i], b.OUTPUT);

//loop();
    for (var i=0;i < LEDs.length;i++) animateLED(LEDs[i]);

//helpers
function animateLED(led){
    function toggleLED(led){ //randomly toggle LED
        b.digitalWrite(led,Math.floor(Math.random()*2)?b.HIGH:b.LOW);
    }
    function randomTimer(){ //randomly set timer between 0~199msec)
        return Math.floor(Math.random()*200);
    }

    setInterval(function(){toggleLED(led);},randomTimer());
}

Arduino の流儀に従って、setup 部分と loop部分を書いてみたが、ごらんのとおり、while/until 的なloopなどしていない。 animateLED()という関数を4回呼び出したあとは、それぞれの関数インスタンスが勝手にタイミングを作って繰り返しの明滅を行っているわけで、それぞれ非同期実行されている。

ところで、
上のスクリプトはCloucd9というIDEから直接実行させる他にも、command line でも

node randomLED.js

というように、実行可能。 いちいちnode を指定するのが面倒ならば、 プログラムの一番上の行にシュバング(#!)を追加してNodeプログラムだということを明示し、

#! /usr/bin/node

randomLED.js を実行可能としておけばプログラム名を指定するだけで実行できる。

$ chmod +x rondomLED.js
$ ./randomLED.js

もともとNode.jsがPHPと同じようにサーバー側のスクリプトを実行することを目的に書かれていることを考えると、bonseScript+Node.jsだけでハードウエアをリモートコントロールできるアプリが書けそうである。