Category Archives: Programming

突然我が家に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マイコンの学習も佳境に入っているところだ。 週末の日数が足りないよ..

Pythonの関数定義とパラメーター

Python3 をいじっていく中で、気が付いたことをこのプログにぼちぼち書き留めておこうと思う。

Pythonの関数定義ではパラメーターも戻り値もタイプを指定しない。C++,Java,Pascalなどの知識のある学習者には異常に見えるが、Python は loosely typed language なんである。

>>> def foo(a,b,c):
	return a*100 + b*10 + c

>>> foo(3,2,1)
321

パラメーターに初期値を持たせることができる。 パラメーターを指定しない場合はその初期値が使用される。

>>> def bar(a=1, b=1, c=1):
	return a*100 + b*10 + c

>>> bar()
111
>>> bar(3)
311
>>> bar(3,4)
341
>>> bar(3,4,1)
341

さらにはパラメーターを明示すれば、カッコ内に現れる順序を気にする必要がなくなる。

>>> foo (a=5,c=2,b=1)
512
>>> bar(c=3,b=2)
123
>>> bar(c=9)
119
>>> bar(c=6,b=4,a=2)
246

Ruby と Python

どちらもInterpreter Languageだが、ひとつを選べと言われたらどちらを覚えたほうがよいのだろう。 
日本ではRubyがかなり人気があるようだが、WorldwideのUser BaseではPythonのほうが多い。 多いと言ってもPHPとかに比べるとかなり少ない。

Ruby

# Old "coke" program from 80's Basic programming book in Ruby
answer = Random.rand(1..100)
count,guess = 0,0
puts 'I am thinking about number between 1 and 100. Can you guess?'
while (answer != guess) 
  guess = gets.to_i
  count += 1
  if guess > answer 
     puts "#{guess} is too high"
  elsif guess < answer
     puts "#{guess} is too low"
  else 
    puts "you got it right in #{count} try!"
  end
end

Python

"""Old "coke" program from 80's Basic programming book, in Python"""
import random
answer = random.randrange(1,100)
print ("I am thinking a number between 1 and 100. Hope you can guess")
guess, count = 0,0
while (answer != guess ):
    guess = input ("what number am I thinking? ")
    guess = int(guess)
    count += 1
    if answer < guess:
        print ( guess, " is too high, try again")
    elif answer > guess:
        print ( guess," is too low. Try again")
    else:
        print ("Bingo! you guessed it right in ",count," tries!")

とりあえず調べて見えてきた部分で大昔、Basicで初期に書いた練習用プログラムを移植してみたが、ごらんのとおり、これくらいのサイズのプログラムなら、どちらで書いてもほとんど差がない。言語のパワフルなところを使ってみないとその差がわからない、という感じだが、 ルーズに行くならPythonかな?インデントでブロックを明示している、つまり単なる書式ではなく、言語の一部になっているのが、なんとも割り切っているところ。 これで{}も"End"も必要ない。 個人的には好きである。 どちらの言語も読み解きやすいのはまちがいなく、これをC++ で書こうとすると、

#include <iostream>
#include <cstdlib> //need this to use rand() 
#include <ctime> //need this to use time() 
using namespace std;

int main(){
    int answer, guess=0, count=0;
    srand(time(NULL));
    answer = rand()%100 + 1;
    cout << "I am thinking about the number between 1 and 100. Can you guess?";
    while (guess != answer) {
        ++count;
        cin >> guess;
        if (guess > answer) 
            cout << guess << "is too high";
        else if (guess < answer) 
            cout << guess << "is too low";
        else
            cout <<"You have it right in " << count << "  times!";
        cout << endl;
                    
    }
    return 0;
}

これよりは楽ですよ。