JF1DIR業務日誌(はてなblog版)

アマチュア無線局JF1DIRのアクティビティをつづっています。

mbedによるGPS同期時計の製作

久々のブログ更新・・・しかも、電子工作の記事が少ないぞ、と言われ続けようやくの工作ネタで更新になりました(汗)。
お空のcondxもイマイチだし無線運用も飽きてきたなと思い、チョット気分を変えるために、購入したけど手を付けられず放置されていた電子工作キット(いわゆる「積みキット」)を消化しておりました。その中にあった秋月電子から出ている時計のキット2種を作ってみました。なんだかんだ時計が一番実用的ですからね(汗)。

下がNTP同期時計で上がGPS同期時計です。この通り、1秒以下できっちり同期しており時刻のズレなど心配せず使えるのですが、このLCD表示では字が小さくて見えないし(寝室に置きたいのでメガネがない状態でも読めないと困る)、バックライトが妙に明るいなど不満が多いものでした。一応シリアルの他桁7セグLEDに接続できる仕様となっているのですが、LEDが選べないのが不満(汗)。どちらも1万円近いお値段で、これならマイコン使って数千円程度で自分で作ってみようと考えました。太陽誘電製GPSモジュールGYSFDMAXBが安価で部屋の中でも衛星が常に受信できるという高性能なので使いこなしたいとも思いました。

表示機はLCDよりは7セグLEDがFBです。しかも最近の眩しい高輝度タイプではなくぼんやりと光る古いタイプを使ってみたいと部品箱を漁ると、古い東芝のTLR324が多数出てきました。2桁の赤LEDでカソードコモンタイプのものです。これを3つ並べて6桁にすればOK。TLR324のピン配置はこちら。古い部品なのでデーターシートを見つけるのに苦労しました。ちなみにコレの緑も在庫があるので2台目は緑にしたいです。

6桁のLEDをダイナミック点灯するので、信号線は8+6で14本。他にGPSモジュールから出ている1PPSの信号とLED点滅を同期させるために2本、合計16本のGPIOと1つのUSART(シリアル)が必要となります。設計当初はRaspberry Pi3でPythonを使って設計したのですが、たかが時計のためにRPiを組み込んでしまうのはもったいないので、普通のマイコンにすることにしました。mbedで安価のLPC1114を使ってみたいところだったのですが、ピン数がギリギリ足りないのでNG。手持ちのSTmicroから出ているNucleoが安価なのでこれを使うことにしました。ここ最近Pythonばかりだったので、C++はかなり抵抗があります・・・だけどだんだん慣れてきました(笑)。

ピン数が多くて組みやすいNucleo F746ZGを使ってで試作。ARM32-bitのCortex-M7が搭載されておりEthernetもなんでもあり最大クロック216MHzというバケモノクラスのボードですね(汗)。GPSのNMEAパーサーとしてTinyGPSというライブラリを利用しました。
全体のプログラムはごく簡単で、mainループ内でtime(NULL)関数で現在時刻を得ながら、GPSからの受信を割り込みで時刻を取得し、一定時間間隔でset_time関数を使って現在時刻をGPSの時刻に設定(補正)していくだけのものです。GPSモジュールの1PPS出力を立ち下がり・立ち上がり割り込みでLEDを点滅させたりなどもしています。一つ注意点としては、LEDのダイナミック点灯の素早いループがmainで走っているのですが、waitを掛けないとLEDが完全に消灯しないうちに点灯するので、全桁「8」の字に見えてしまいます。これもTLR324のような古いLEDを使っているせいでしょうか、2〜5msくらいのwaitで塩梅よくLEDが点いてくれました。それと、ピンあたりの電流量が不足しがちなので、GPIOに直接LEDを繋げるのではなく、アノード側にソースドライバTD62783AP、カソード側にシンクドライバTD62083AFNPを使いました。これでアノード側もカソード側も正論理でスイッチすることができるので、ソースコードのロジックが気持ち悪くなくなります(苦笑)。

ここまでは順調に行ったのですが、次に安価なNucleo F401REに載せ替えようとしたところ、急に動かなくなりました。mainループでハングアップ。どうやらシリアル割り込みするとハングアップするようです。F401REには2つのUSARTポートがあり、USART2(tx:D1, rx:D0)であったところを(ちなみにD0, D1ピンは裏面のハンダブリッジをしないと使えないので注意。これもしばらくハマった)。USART1(tx:D10, rx:D2)にすると、mainが動き出しました。しかしLEDの表示がヘンです。そこで割り込みの優先度を上げるためのおまじないとして、"NVIC_SetPriority(USART1_IRQn, 0);"を記述したり、ダイナミック点灯のwaitを微調整しました。それでも安定しません。最後に、GPSからの受信割り込みのコードを一番最初に書くと、完璧に治りました。この正解にたどり着くまで2日費やしまった(大汗)。mbedでもボードを変えるといろいろ不具合が出るものなんですね。Nucleo F401REでの試作の様子がコレ。

後はユニバ基板に取り付けケーシングし、視認性がよい安価なGPS同期時計が完成です。
以下にソースコードを示しますが、上記のようにmbedプラットフォームによってそのままでは動かないことがあるので注意して下さい。

/*    GPS同期時計 mbed版 by JF1DIR 2017
 *    Nucleo F401RE
 */

#include "mbed.h"
#include "TinyGPS.h"

DigitalOut led[8]={D1, D3, D4, D5, D6, D7, D8, D9}; // nucleo F401RE
DigitalOut digit[6]={D14, D15, D12, D13, D0, D11};
DigitalOut pps(PC_0);
InterruptIn pps_in(PC_1);
Ticker ticker_set_time;

int number[11][8]={
                    {1,1,1,1,1,1,0,0},          //zero
                    {0,1,1,0,0,0,0,0},          //one
                    {1,1,0,1,1,0,1,0},          //two
                    {1,1,1,1,0,0,1,0},          //three
                    {0,1,1,0,0,1,1,0},          //four
                    {1,0,1,1,0,1,1,0},          //five
                    {0,0,1,1,1,1,1,0},          //six
                    {1,1,1,0,0,0,0,0},          //seven
                    {1,1,1,1,1,1,1,0},          //eight
                    {1,1,1,1,0,1,1,0},          //nine
                    {0,0,0,0,0,0,0,1}          //dot
                  };

Serial serial_gps(D10, D2);  // UART1: tx, rx なぜかF401REのUART2では割り込み不能
TinyGPS gpsr;

int year;
byte month, day, hour, minute, second;

void led_off()
{
    pps = 0;
}

void led_on()
{
    pps = 1;
}

void setup()
{
    pps = 0;
    serial_gps.baud(9600);
    NVIC_SetPriority(USART1_IRQn, 0);
}

void getgps()
{
    if (serial_gps.readable()) {
        char c = serial_gps.getc();
        bool gps_avairable = gpsr.encode(c);
        if (gps_avairable) {
            (void)gpsr.crack_datetime(&year, &month, &day, &hour, &minute, &second);
        }
    }
}

void gps_to_nowtime()
{
    struct tm t;
    t.tm_sec = (int)second;
    t.tm_min = (int)minute;
    t.tm_hour = (int)((hour + 9) % 24);
    t.tm_mday = 1;
    t.tm_mon = 1;
    t.tm_year = 100;
    
    time_t sec2 = mktime(&t);
    set_time(sec2);
}

int main() {
    int h, m, s, v, j, k = 0;
    int x[6] = {0, 0, 0, 0, 0, 0};
    
    time_t seconds;
    struct tm *ts;

    setup();
    serial_gps.attach(getgps, Serial::RxIrq);
    ticker_set_time.attach(&gps_to_nowtime, 10.0);
    pps_in.fall(&led_on);
    pps_in.rise(&led_off);

    while (1) {
        seconds = time(NULL);
        ts = localtime(&seconds);
        h = ts->tm_hour;
        m = ts->tm_min;
        s = ts->tm_sec;
        
        x[0] = (int)(h / 10);
        x[1] = (int)(h - x[0] * 10);
        x[2] = (int)(m / 10);
        x[3] = (int)(m - x[2] * 10);
        x[4] = (int)(s / 10);
        x[5] = (int)(s - x[4] * 10);

        for (v = 0; v < 8; v++) { led[v] = 0; }
        for (v = 0; v < 6; v++) { digit[v] = 0; }
        
        digit[k] = 1;
        j = x[k];

        if ((k == 1) or (k == 3)) {
          for (v = 0; v < 7; v++) { led[v] = number[j][v]; }
          led[7] = 1;
        } else {
          for (v = 0; v < 8; v++) { led[v] = number[j][v]; }
        }
 
        wait(0.005);
        k++;
        if (k > 5) { k = 0; }
    }
}

ハムフェア参加しました

しばらく更新をさぼってしまいました。スミマセン。ネタはいろいろあるので、そのうちアップしていきます。

さて、先日行われたハムフェアに参加してきました。今年は仕事の都合で初日のみ参加しました。異様に涼しく過ごしやすかったですね。
今年もアイボール中心で楽しみました。コンテストでいつもお世話になっている局、SNSなどで仲良くしていただいている局などなど、ご挨拶できて大変FBでした。

いつもやっていることの一つに「ハムフェア公開記念局の運用」です。今年は「8J1HAM」というコールでした。8時過ぎに記念局受付の列に並ぶと既に7MHzと430MHzは全部予約済み。なんとか14時に144MHzの枠をゲットしました。殆どが会場内からのコールでしたがたくさんQSO頂きありがとうございました。

夜はJK1JHU青木さんが開催している「コンテスターミーティング」に今年も参加させていただきました。総勢50人以上集まり、例年通り大いに盛り上がりましたね(^^) その後、夜中の1時まで新橋を呑み歩いていました・・・^^;

今年のメーカーブースの目玉はICOMのIC-9700でしょうか。IC-910の後継的な位置付けのようで、楽しみですね。

ゲットしたブツはこちら。GHDの小型パドルは移動運用で使ってみようかと思います。ON4UNのローバンド本は原著も持っているのですが思わず日本語版も買ってしましました。

各局ありがとうございました。

ALL JAと東京コンテスト参加

先日作った記念局の運営と運用が忙しくて、なかなか更新できていませんでした。スミマセン^^;
ALL JAコンテストは二日目の朝から夕方までのちょこっとパート運用。天気が良かったので近くの高いところに行ってみました。でも一応入賞を企んだので、50MHz電信電話のQRP部門X50Pにしてみましたが、どうでしょうか。
アンテナはいつものRadix2エレでFT-857 5W + 10Ahリチウムバッテリー運用です。結果は、7時半ごろから16時なので約8時間ちょっとの運用で約400QSOなので、まぁまぁ楽しめました。Esが出ることがなくマルチに苦しみましたが、過去の実績からエリア入賞はなんとかできそうです。CW:Phone = 179:227QSOでした。

ゴールデンウィークとくっついてしまったせいか、参加局が少なめのようでしたね。16時でもう呼ぶ局がいなくなってしまったし、苦行になりそうになったのでサクっとやめました。がんばらないで楽しむのが肝心かと^^;

***

5/3に行われる恒例の東京コンテストも近くの高いところでの移動運用です。朝9時からのスタートは移動局にとっては本当にうれしいですネ。参加部門をどうしようかいろいろ悩みましたが、condxに左右されず運用しやすい144MHz電信電話にしてみました。アンテナはRadixの3エレをアルミポールと一緒に担いでの運用です。
スタートは電話からスタートダッシュを狙うのが常套ですが、コンテスト開始直前、SSB帯があまりにもQRMMだったので、CW Runningからスタート。悪くない滑り出しでレートが落ちはじめたころにS/P行かずに電話でRunningしてレートをキープしたつもりです。13時頃からなかなかNewが見つからず苦労しますが、モノバンドでは工夫のしようがあまりないので、S/PとRunを繰り返すのみ。どちらかというと電話を多めに運用したつもりです。CW:Phone = 96:132QSOでした。

去年実績の2位のスコアに付けたので期待出ると思います。CWだけの運用よりはMixの方が楽しいですね!喉が疲れますが・・・
各局たくさんのQSOありがとうございました。

8J1C70Y 茅ヶ崎市制施行70周年記念局

コールサインが確定したようなので(まだ正式にはJARLから連絡きてませんが)、茅ヶ崎市制施行70周年の記念局(JARL特別局)を立ち上げました。5/1より開局です。
そのWebサイトも本日公開しました。自宅のラズパイをサーバーにしております。

https://jf1dir.info/~eventst/

まだ工事中のページがありますがご了承下さい。また近日中にSSL化します。
たくさんのQSOよろしくお願いします。

(追補:4/22の朝にSSL化いたしました)

Raspberry PiでWebサーバーの諸設定(その2)

まだ設定が終わってなかったので、前回の続きを書いておきます。環境はRPi3にRaspbian 8.0/jessie(kernel 4.4.50-v7)、apache/2.4.10です。

FTPサーバーの設定

自宅サーバーを地元のハムクラブのWebページの引越し先にするという話になり、以前のWebページの管理者がFTPでファイルを転送する必要がでてきました。

$sudo apt-get install vsftpd

/etc/vsftpd.confを編集します。

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
ascii_upload_enable=YES
ascii_download_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list

次にユーザー設定ファイル/etc/vsftpd.chroot_listにFTPユーザーのリストを記載。
さらに、ルーターの静的マスカレード設定でftpのポートtcp20と21番を開けて、ファイアウォールの設定を許可し、デーモンをリスタート。

$sudo ufw allow 20
$sudo ufw allow 21
$sudo service vsftpd restart

BASIC認証を設定

Webのとあるページを仲間うちだけアクセスできるよう、パスワードをかけておく基本的な認証方式。やり方はいろいろあるようで、その一つのうまく行った例を上げておきます。
まずはパスワードファイル.htpasswdを作る。IDはfoobarとする。

$sudo htpasswd -c /etc/apache2/.htpasswd foobar

保存先を/etc/apache2になっているが場所は任意。パスワード聞かれるので答えるとファイルが生成される。
/etc/apache2/apache2.confの末尾に、

<Directory "/home/xxxx/public_html/">
AuthType Basic
AuthName "Please enter your ID and password"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
#AuthGroupFile /dev/null
</Directory>

としapache2をrestart。/home/xxxx/public_html/にアクセスしようとするIDとパスワードを求められるようになります。

let's encryptによるSSL

let's encryptで無料でSSL化できるということなのでやっておきした。https://でないWebは怖がってアクセスされないようです。
まずはルーターの443番ポートを静的マスカレード設定で開けておき、

$sudo ufw allow 443

ファイアウォールでも443番ポートを開けておく。GitでCertbotをCloneする。

$sudo apt-get install git
$cd /usr/share
$sudo git clone https://github.com/certbot/certbot
$cd certbot
$./certbot-auto

この時点でいろいろ聞かるけど、Ctrl+Dで一旦終了。証明書をもらう手続きをコマンドでやってしまう。独自ドメインだとまず問題なくもらえるらしいです。

$./certbot-auto certonly --standalone -d jf1dir.info -m jf1dir@jarl.com --agree-tos

/etc/apache2/sites-available/default-ssl.confを編集。

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/jf1dir.info/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/jf1dir.info/privkey.pem

SSLの設定を有効にしておく。

$sudo a2ensite default-ssl
$sudo a2enmod ssl
$sudo service apache2 restart

これでjf1dir.infoがSSL化されます。
なお90日で更新せよとメールが来ますので、certbotをインストールしたディレクトリに移動して、

$sudo service apache2 stop
$sudo ./certbot-auto renew
$sudo service apache2 start

これで更新できます。

NTPサーバとRaspberry Piの時刻同期

NTPデーモンの設定ファイルである/etc/ntp.confファイルを編集。

$ sudo nano /etc/ntp.conf

server 0〜4から始まる行をコメントアウトまたは削除し、"pool ntp.nict.jp iburst"を加える。

$ sudo service ntp restart

NTPデーモンを再起動します。"ntpq -p"で同期状態を確認できます。

Raspberry PiでWebサーバーの諸設定

先日Raspberry Pi3を導入し電子工作のツールとして使おうと考えていたのですが、立派なLinuxマシンを遊ばせておくのはもったいないと思い、また、とある必要性からWebサーバーに仕立て上げようと思い立ちました。他にLinuxマシンがあるのですが、あえてRPiで、ということでしょうか(汗)。
ここ数日Webサーバーの設定を済ませた後にラズパイをいじっているときにmicroSDカードを機械的に破損させるなどの事故があり、OSのインストールを2度繰り返す羽目になりました(苦笑)。来るべき3度目のため(?)に備忘録として設定の一部始終をここに書いておきます。初めての方にも参考になるかもしれませんが、ちゃんと動くかどうかの保証は致しかねます(汗)。なお、OSのバージョンはRaspbian JESSIE LITE 2017.4.10版、WiFiを使わずEthernet接続です。

起動前に非HDMIモニタへの対応

HDMI-VGA変換アダプタを使って非HDMIモニタにつなげる場合の設定。DDでmicroSDカードへOSのイメージを書き込んだ後に、RPiを起動する前に/boot/config.txtを編集してしまう。

hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
hdmi_group=2
hdmi_mode=39

これでVGAモニタに1360x768ピクセルの画面解像度で表示される。microSDをRPiに挿して電源を入れる。

raspi-configでいろいろ設定

RPiを起動後、ユーザー名pi、パスワードraspberryでログイン。対話型設定ソフトraspi-configでパスワード変更、host名変更、ローカライゼーション(タイムゾーン、キーボード設定)、インターフェイス設定(SSH有効化)、カードの拡張などを済ませておく。

$ip route

でRPiのローカルIPを確認。他のPCからSSHでログインを確認。これ以降、他の端末からSSH接続するので、キーボードやディスプレイをはずしておく。

キーボードのCTRLとCAPSを入れ替え

好みにより、CTRLキーとCAPSキーを入れ替える。/etc/default/keyboardを編集。

XKBOPTIONS="ctrl:swapcaps"

Xの設定っぽいけどこれで大丈夫。Xは使わないに。その後リブートして有効になる。

rootのパスワード変更

rootが無防備なのでまずはなによりパスワードを設定する。

$sudo passwd root

piユーザーを他のユーザー名(yuji)に変更。piでログインした状態で、

$sudo useradd -M foo
$sudo gpasswd -a foo sudo
$sudo passwd foo
$exit

fooでログインし、

$sudo usermod -l yuji pi
$sudo usermod -d /home/yuji -m yuji
$sudo groupmod -n yuji pi
$exit

yujiでログインし、fooを削除。

$sudo userdel foo
$sudo pass yuji

IPを固定化(イーサーネット)しておく

ip routeで確認したローカルIPが192.168.1.10とする。/etc/dhcpcd.confを編集。末尾に、

inteface eth0
static ip_address=192.168.1.10/24
static routers=192.168.1.0
static domain_name_servers=192.168.1.0

その後リブート、他の端末からSSHでログインしてチェックする。

Sambaをインストール

Windowsとファイル共有するときに便利なのでいれておく。

$sudo apt-get install samba

/home/yuji/sambaにWindowsのファイルが見えるようにする。
/etc/samba/smb.confを編集、末尾に、

[share]
path=/home/yuji/share
read only=No
browsaeble=Yes
guest ok=Yes
force user=yuji
$mkdir /home/yuji/share
$sudo service samba restart

でsambaをrestart(エラーが出る場合は、smbdとnmbdをrestart)。
Windowsエクスプローラで\\192.168.1.10を開くとshareのフォルダが見えるようになる。

RSA公開鍵認証方式でSSHログイン

クライアント側(Teratermなど)で鍵を作成。パスフレーズを入力し、Public keyとPrivate Keyのファイルを保存。それぞれ、
id_rsa.pub, id_rsaとする。id_rsa.pubをRPiへコピー。samba共有したフォルダにコピーしておく。サーバのRPi上で、

$mkdir ~/.ssh
$chmod 700 ~/.ssh
$mv ~/share/id_rsa.pub ~/.ssh
$cd ~/.ssh
$ssh-keygen -i -f id_rsa.pub >> authorized_keys

"uudecode failed."とエラーが出る場合は、

$ cat id_rsa.pub >> authorized_keys

とする。
/etc/ssh/sshd_configを編集

PermitRootLogin no
PasswordAuthentication no
RSAAuthentication    yes
PubkeyAuthentication yes
AuthorizedKeysFile   %h/.ssh/authorized_keys

sshをrestart。これでrootでログインできなくし、パスワード入力によるログインも禁止になり、セキュリティレベルが上がる。
クライアント(Teratermなど)でアクセスするとき、秘密鍵のファイルid_rsaを指定してログイン。鍵ファイルはRPi上には置かない。id_rsaなどのファイルはパーミッションを600に設定しておくこと。

Apache2インストール

$sudo apt-get install apache2

ブラウザでhttp://192.168.1.10をアクセスして"Work It!"の表示を確認。

$sudo a2enmod userdir

これで~/public_htmlの下にアクセスできるようになる。ブラウザでhttp://192.168.1.10/~yuji/public_html/test.htmlなどで表示させてチェック。

CGIの設定

~/public_html/cgi-binの下にあるPerlPythonプログラムを起動させるとする。

$sudo ln -s /etc/apache2/mods-available/cgi.load /etc/apache2/mods-enabled/cgi.load

/etc/apache2/sites-aviailable/000-default.confを編集。

Include conf-available/serve-cgi-bin.conf

/etc/apache2/mods-available/mime.confを編集し、CGIプログラムの拡張子を設定。

AddHandler cgi-script .cgi .py .pl

/etc/apache2/conf-available/serve-cgi-bin.confを編集。

ScriptAlias /cgi-bin/ /home/*/public_html/cgi-bin
                <Directory "/home/*/public_html/cgi-bin">

これで~/public_html/cgi-binの下のCGIプログラムが有効になる。
/etc/apache2/mods-available/userdir.confを編集

<Directory /home/*/public_html>
                AllowOverride FileInfo AuthConfig Limit
                Options MultiViews SymLinksIfOwnerMatch IncludesNoExec

OptionsにIndexesを取り去ると、ブラウザ上に(index.htmlがないディレクトリとかで)ディレクトリ構造が見えなくなる。
apache2をrestartすると反映されるので、~/public_html/cgi-bin/のプログラムをブラウザから起動させて確認。プログラムにはchmodしておく。

ポートの開放

光ルータにアクセス。ブラウザからhttp://192.168.1.1/を開く。
静的IPマスカレード設定で、ポート番号80と22を開いておく。この瞬間から世界中からSSHログイン攻撃が始まる。sudo lastbで確認できる。rootやpiのパスワードは絶対に設定しておくこと。
自宅IPのグローバルIPを把握する。

$curl httpbin.org/ip

このIPを別のネットワーク上の端末のブラウザで開いてみる。Apache2の設定のときの"Work It"の画面が出ることを確認。

ファイアーウォールの設定

SSH, WWW, Sambaのポートを許可する。それ以外を禁止。

$sudo apt-get install ufw
$sudo ufw disable
$sudo ufw default deny
$sudo ufw allow proto tcp from 192.168.1.0/24 to any port 22
$sudo ufw allow 8080
$sudo ufw allow 80
$sudo ufw allow 137/udp
$sudo ufw allow 138/udp
$sudo ufw allow 139/tcp
$sudo ufw allow 445/tcp
$sudo ufw enable

SSHのポート22番はLAN内のアクセスに制限しているが、外からのログインもやりたい場合はufw allow 22とする(ただし外からのSSH攻撃に会うので、セキュリティ対策をしっかりしておくこと)。
ファイアーオールの設定は$sudo ufw statusで確認。

MyDNS.jpのDDNS更新をcronで行う

独自ドメインを取得し、MyDNSを利用しているのでDDNSの更新の設定をしておく。

$crontab -e
(以下の1行を追加して保存)
*/10 * * * * wget -q -O /dev/null http://(mydns.jp のマスターID):(mydns.jp のパスワード)@www.mydns.jp/login.html

Gmail経由でmailを出せるようにする

Gmailのアドレスはxxxx@gmail.com
Googleのログイン名をxxxx、パスワードをfoobarとする

$sudo apt-get install mailutils
$sudo apt-get install ssmtp

/etc/ssmtp/ssmtp.confを編集

root=xxxx@gmail.com
mailhub=smtp.gmail.com:587
hostname=xxxx@gmail.com
AuthUser=xxxx
AuthPass=foobar
USESTARTTLS=YES

$mail xxxx@gmail.comでメールが送られてくるか確認。セキュリティの低いクライアントからのアクセスが有りましたとGoogleから知らせが来るのでGmailの設定で許可しておく。

Python関連をインストールする。

Pipではなぜか失敗するので、すべてapt-getでインストールする。

$sudo apt-get install python-pip
$sudo apt-get install python-numpy
$sudo apt-get install ipython
$sudo apt-get install python3
$sudo apt-get install ipython3
$sudo apt-get install python3-pip
$sudo apt-get install python3-numpy

など。Python3も入れておくがデフォルトはPython2しておく(そのほうがトラブルが少ない?)。

Pyboardを動かす

引き続きマイコンネタです。前回はラズパイで動くLinux上のPythonでラズパイのハードウエア(GPIO)を制御したのですが、Pythonでそのまま動くマイコンがあるというので早速Amazonで入手してみました。Pyboardです。

どういうことかと言うと、例えば、Arduinoなどでは、PCで開発環境などを使ってソースコード(C言語)を書きビルドしてマイコンと通信してプログラムを送り込むということをするのですが、Pyboardの場合はマイコン上にMicro PythonというPythonが実装されているので、Pythonコードだけで動きます。これは簡単です。しかもPyboardをPCにUSBでつなぐとストレージとして認識するので、その中に入っている"main.py"を書くだけです。
例えば、

# main.py -- put your code here!
import time
from pyb import Pin
pin_out = Pin('X12', Pin.OUT_PP)
while True:
	pin_out.high()
	time.sleep(1)
	pin_out.low()
	time.sleep(1)

をmain.pyに書き込んで、X12端子とGNDにLEDを付けてPyboardをリセットするだけでLチカが動きます。ついこの間はmbedで感動したのですが、これは更に簡単になってますね。
ピン配置は、

これを見るとわかるように、SPI, I2Cや各種ペリフェラルに対応しています。スペックは、STM32F405RGマイクロコントローラ、1024KiBフラッシュROMと192KiB RAM、Micro SDカードスロット対応などなど。
さてこれで何をするかですね。悩みます^^;