Make: AVR Programming pt.02

 まだまだ続く。けど夏休み中に終わらせるのは無理っぽい。

http://squeuei.hatenablog.com/entry/2016/08/15/001834squeuei.hatenablog.com

Chapter 6

 ボタンスイッチをマイコンのデジタルIOに接続する時は、プルアップ抵抗を使うこと。プルアップ抵抗はボタンがオープンの時にレベルを確実にハイにするために必要な抵抗。ただし、AVRの場合は全てのピンにプルアップ抵抗が組み込まれていて、設定で有効化できる。

 Chapter 2で言及したように、DDRxが0(入力)のとき、PORTxはプルアップの設定になる。

プッシュボタンを使うときのチェックリスト

  1. DDRxレジスタを入力にする。
  2. プルアップのために抵抗素子を使わない時は、PORTxで内蔵のプルアップを有効にする。
  3. コードの中でボタンの電圧を読む。
  4. ボタンが押されてる間に何かをしたいのか、ボタンが押されたときに何かをしたいのかをヨーク考える。
  5. ボタンが押された時に何かをしたいのなら、デバウンシングすることを考える。たとえば一度押されたことを確認して、さらに一定時間後にも押されてたら、そのとき初めて何かを実行する、のような。

Chapter 7

LDRについて

 LDRを使う際、組み合わせる抵抗は

{\displaystyle
\mathrm{R} =\sqrt{
\mathrm{R}_{\mathrm{LDR}\mathrm{bright}}\cdot\mathrm{R}_{\mathrm{LDR}\mathrm{dark}}
}
}

で決定するのがよい。

ADCを使う時の注意

 アナログ回路設計のグッドプラクティスとしては、高速なスイッチングがあり、スパイクが乗るチップと、性格で安定した値が要求されるADCとで、独立した電源を供給するのが望ましい。特に、小信号や高周波信号を扱う時には重要となる。

  1. AVCCに給電した? システムのVccからの差は0.3 V以内でなきゃダメ。
  2. ADMUXのREFSxを設定した? デフォルトではAREFの外部電圧を基準とする。AVCCを基準にしたいのならREFS0をセットしないといけない。
  3. ADCのプレスケーラを設定した? ADCにはクロック源が必要。
  4. ADENを設定してADCを有効化した?
  5. マルチプレクサで正しいchを選択した? 設定はbitじゃなくてbinaryだよ?
  6. 最後に、ADCの値を別々に読むときはADCL(下位ビット)から読み込んでる? 10bit読むときはADCLを読み込んでからじゃないとADCH(上位ビット)は更新されないよ?

 上記の設定をしてから、ADCSRAのADSCを設定することで、ADCは変換を開始する。

 ADCSRAのADATEを有効にしてフリーランニングを使う時も、最初の一回はプログラマがADSCを設定しなきゃいけない。

 ADLAR=0のときはADCHの下位2ビットとADCLの8ビットがADCの出力となる。

 ADLAR=1のときはADCHの8ビットとADCLの上位2ビットがADCの出力となる。

 ADMUXでマルチプレクサを設定するときは、上位4ビットの値を保ったまま、下位4ビットを設定しなきゃいけない。 よくやるのはこんな感じ。

ADMUX = (0xf0 & ADMUX) | channel;

Make: AVR Programming pt.01

 買ってから優に一年間放置していた“Make: AVR Programming”を夏休みに読んでしまおう計画。

http://squeuei.hatenablog.com/entry/2015/08/11/212000squeuei.hatenablog.com

Chapter 1

 AVRISPmk2を入手しておいたのだけど、こいつは自分で+5Vを供給してくれないので、ACアダプタでブレッドボードに5Vを給電するとかしないといけない。かつ、私の環境ではavrdudeでうまくmake flashしてくれないので、Arduino ISPを活用することにする。ISP買った意味がない。

 システムやユーザの環境変数を通すのが嫌だったので、PATHを通すバッチファイルを書いて、そこから操作することにする。

PATH=%PATH%;foo\bar\avr8-gnu-toolchain\bin;hoge\fuga\avrdude_utilities;
cd mado\homu\AVR-Programming

といった内容の.batファイル(ここでは安易にavr.batとした)を作成した後、エクスプローラから

C:\Windows\System32\cmd.exe /k "yui\azu\avr"

というショートカットを作る。フォルダやファイルの場所は各自修正のこと。ショートカットがリンクする先の最後にあるavrは.batファイルのファイル名にする。拡張子を付けないのが個人的にポイントだった。

 このショートカットを開けば、コンパイラとユーティリティへのPATHが通ったコマンドプロンプトが開く。

 サンプルコードを書き込む際には、Makefile

PROGRAMMER_TYPE = avrisp
PROGRAMMER_ARGS = -b 19200 -P com3

などとして、PATHが通ったコマンドプロンプトからmake flashする。

Chapter 2

 RAMに変数をつくることと、ピンへの書き込みやピンの入出力設定は同じインタフェース(代入)で行われるけど、これは実際に同じ事をレジスタに対して行っているから。そのレジスタの情報はio.hに格納されてる。

重要なハードウェアレジスタ

  • DDRx : data-direction registers port x

    インプットかアウトプットかを決める。

  • PORTx port x data registers

    • アウトプットに設定したとき:high or lowを設定
    • インプットに設定したとき:pull-upするかどうか(chapter 6参照)を設定
  • PINx port x input pins address

    • インプットに設定したピンのhigh or lowを読んだ結果が格納される。

 デフォルトで全部のピンはインプット。

 DDRの設定をせずにPORTを設定してしまうパティーンが多いので気をつけよう。

Chapter 3

 MOSFETはLEDのGNDとプログラマのGNDをいちいち手で接続したり外したりするのがめんどうなので使う、とのこと。

 正直肉眼で見ても全然わからなかったので写真に撮る。

f:id:squeuei:20160815001430j:plain

 Analog Discovery2のロジアナで見るとこんな感じ。ありがとうAD2。

f:id:squeuei:20160815001520j:plain

Chapter 4

サイロン (Cylon) は、SFテレビドラマ『宇宙空母ギャラクティカ』に登場する架空のキャラクター。
サイロン - Wikipedia

 さすがにわからん。

 プリアンプルの#defineは大文字をアンダースコアで区切って書くのが慣例。

  • ビットの設定:OR
  • ビットの消去:AND
  • ビットの反転:XOR

Chapter 5

 UARTのRT/TXの関係はSPIとは違って送り手と受け手で逆になるから気をつけよう。

 以下はこの本の著者が用意した便利関数の数々。

 initUSARTは、ボードレートの設定、2Xモードの設定、RXTXの有効化、データ長とストップビットの設定を行う。

void initUSART(void) {
  UBRR0H = UBRRH_VALUE;
  UBRR0L = UBRRL_VALUE;
#if USE_2X
  UCSR0A |= (1 << U2X0);
#else
  UCSR0A &= ~(1 << U2X0);
#endif
  UCSR0B = (1 << TXEN0) | (1 << RXEN0);
  UCSR0C = (1 << UCSZ01) | (1 << UCSZ00);
}

 送信時はUCSR0A(USART Control and Status Register 0 A)レジスタのUDRE0(USART Data Register Empty)が1になるまで待って、それからUDR0(USART Data Register)に送信したいデータを格納する。

void transmitByte(uint8_t data) {
  loop_until_bit_is_set(UCSR0A, UDRE0);
  UDR0 = data;
}

 受信時はUCSR0AレジスタのRCX0(receive-complete bit)が1になるまで待って、それからUDR0の値を読みに行く。

uint8_t receiveByte(void) {
  loop_until_bit_is_set(UCSR0A, RXC0); 
  return UDR0;
}

 私が持っていたUSB-RS232C変換ケーブルだと、PCで入力した文字と送信された文字が食い違う現象が発生した。

 これもAnalog Discovery 2のロジアナが無ければ、何が起きているのかわからないままだった。ありがとうAD2(2回目)。

 そういえばRaspberry Pi2Bを買ったまま死蔵していたなという事を思い出したので、下記サイトを参考に、シリアルコンソールによるログインを無効に設定してから

  • RPi2B Pin 5 <-> AVR GND
  • RPi2B Pin 7 <-> AVR Pin 2
  • RPi2B Pin 9 <-> AVR Pin 3

で接続し、cu -s 9600 -l /dev/ttyAMA0すると、ちゃんと動作した。

備忘録 Raspberry PiでUART、シリアル通信

Raspberry PIのGPIO上シリアルとArduinoの通信 - Qiita

RPi2 Model B IO Pins – Raspberry Pi Projects

 意外なところで意外なものが役に立つものだなあと、感心することしきりである。

2016年度版、これが私の手帳の書き方

 それは、考えなしになるための方法論。

イントロダクション

 手帳の使い方についていろいろ考えたのでまとめる。

覚えておくために書く

 まず何でもいいから、その日あったこと、考えたことを書く。何でも書く。ニュースに頼ってもいいから書く。

 放っておいたら何もかもを忘れてしまう。確かにあったはずのことなのに、思い出せないなんてことが許せると思える? 私には無理です。

 書くことは最もプリミティブな記録のひとつです。どんな悪文でどんなクソみたいな内容が書かれていても、それがいつかきっとあなたの財産になる(その価値はあなたの頭の中だけにしかないとしても)。  たとえば、レフト式の手帳を使うなら、左ページの余ったスペースにN行日記を書く、というのはいかがでしょう。

 本当は電子化したほうが、検索性の上で便利ですが、そこのところは私もどうしたらいいのかはかりかねているところです。

忘れるために書く

 覚えておきたいことを書いておくことは、思い出そうと思った時に思い出せる、ということに他ならなりません(実際にはどうインデックスを作っておくかが問題になるのですが)。

 逆に言えば、いつでも思い出せるなら、忘れてしまってもかまわない、ということでもあります。ある事項について、それを忘れてしまえば、そのことについて考えずにすみます。思考のリソースは有限なのです。

 六月最終週に新クールの録画予約するということを書いておき、定期的にその記述を確認しておけば、その日まで毎日覚え続けておく必要はないし、それまでに忘れてしまう確率も下がることでしょう。

 思いついたやるべきことはすぐに書く。書いたものは定期的に見直す。この合わせ技で、何かをし忘れるということはそれなりに減ります。サボりとかを除けば。

 どこでも最低限のメモを残せるように、小さなメモ帳を常に持ち歩くというのもよいでしょう。ダイヤメモとか、すぐメモとか、あるいは野帳とか。これらは、手帳がポケットに入らないくらい大きい、上着の中ポケットに手帳を入れると膨らんでかっこ悪い、などの場合に有利です。

考えなしになるために書く

 これは、やることを覚えておかなくてもいいようにしたら、次は「これから何をするべきか」を考えることすらしないようになりたい、という怠惰な発想に基づいた行動スキームです。

 まず、やるべきことのリストを整理します。これはwikipediaのGTD項を参考にしました。

foreach やるべきことのリスト:
    if 行動すべき?:
        if 所要時間 <= 2分:
            いますぐやる
        else if 達成にいくつもステップが必要?: 
            “プロジェクト”リストへ追加
        else if 自分がする必要がある?:
            誰かに依頼する
            依頼した内容を“連絡待ち”リストへ追加
        else if やる日程が決まってる?:
            日時を指定して手帳やカレンダーに追加
        else:
            “次のアクション”リストへ追加
    else:
        if いつかはやりたい?:
            “いつかする”リストへ追加
        else if 記録しておく価値がある?:
            “資料”リストへ追加
        else: 
             忘れる

 重要なのは、具体的で実行可能なステップに分解することです。

「これをするためにはどうすればいいんだろう?」と考えるようではダメです。何も考えること無く書いてあることに従えるようにするのが肝要です。

 また、優先度があまりにも異なることを、リストに並べないほうが良いかと思います。締め切りなどで、明確に優先すべきことがあるならスケジュールに入れてしまう方がよろしいかと。

 そうしないと「このリストのどれから手を付けよう」と考えなければなりません。思考は敵です。「どれも同じくらいの優先度だから、どれから手をつけても同じ」という状況を作るのです。

 私はNOLTYの手帳と手帳専用の補充ノート、それに普通のキャンパスノートを使って、下記の様に整理してます。

 基本的には場所毎のアクションへの落とし込みを意図しています。が、これは私にとっても持続不可能なくらい、項目が細かすぎるかもしれませんので、そこは各自うまくやりましょう。

  • “プロジェクト”
    • 業務:手帳に挟んだノート
    • プライベート:手帳に挟んだノート
  • “連絡待ち”
    • 業務:手帳に挟んだノート
    • プライベート:手帳に挟んだノート
  • カレンダー:
    • 日付が決まってる:手帳の月間ページ
    • 日時が決まってる:手帳の週間ページ
  • “次のアクション”
    • 業務:手帳に挟んだノート
    • 家:手帳に挟んだノート
    • 市内:手帳に挟んだノート
    • 市外:手帳に挟んだノート
    • 通販:手帳に挟んだノート
  • “いつかする”
    • 設備:手帳本体のノート欄
    • 読む本、聞く音楽、見るアニメ :手帳本体のノート欄
    • 勉強したいこと:手帳本体のノート欄
    • 旅行先:手帳本体のノート欄
  • “資料”:独立したノート

 あとは、前のアクションが終わったら、自分のいる場所の“次のアクション”リストを順次実行するだけです。どれも同じ優先度なら、どれから手を付けても、上から下でも、乱択しても、問題ないですよね?

 個人的な感覚として、このGTD(もどき)で2番目に大事なのは「具体的で実行可能なステップに分解する」で、1番目は「2分以内にできることはすぐやる」です。

予約をする

 絵に限らず、何事も突然上手くなることはありません。時間で殴る必要があるのです。

 レフト式やバーティカル式の手帳を使っているなら、そのための時間を先にallocしてしまうのです。特に、長期目標の場合には、上記したプロジェクトリストの中身と連携するのが良いのだと思われます。目標から逆算して分解した具体的な行動を、実施する時間を確保しておくことで着実に推進するのです。

 実のところ、ここのパートは自分もまだうまくできてないのですが、毎日一定の時間を確保して作業するのは脳にいいって『できる研究者の論文生産術 どうすれば「たくさん」書けるのか』にも書いてあったし、上手くいって欲しいし、上手くいくようになりたい。

結論

 tl;dr: 二分以内にできることはすぐやれ、やることリストを作るなら明確で具体的な行動の形で書け、やりたいことがあるなら時間を決めて毎日やれ。

余談

 来年にはまた“最高の手帳活用法”を“発見”して書き方変わってる予感しかない。

参考文献

意志力の話

WILLPOWER 意志力の科学

WILLPOWER 意志力の科学

GTD関連

全面改訂版 はじめてのGTD ストレスフリーの整理術

全面改訂版 はじめてのGTD ストレスフリーの整理術

www.lifehacker.jp

その他

できる研究者の論文生産術 どうすれば「たくさん」書けるのか (KS科学一般書)

できる研究者の論文生産術 どうすれば「たくさん」書けるのか (KS科学一般書)

kaiteki.hateblo.jp

getnews.jp

chromebook flip C100PA でlinux環境づくり

amazon.comからchromebook flip C100PAのメモリ4GBモデルを購入したので、小型軽量ファンレスlinuxマシンとして使わんとする人々に有用と思われるTipsを以下に示す。

UPDATE 2017-06-06

mainline kernelを用いたArch Linux ARMの環境構築については下記記事を参照のこと。

http://squeuei.hatenablog.com/entry/2017/06/06/174048squeuei.hatenablog.com

各種テスト

このあたり参考に。

  1. Ctrl-Alt-t でcroshを起動
  2. memory_testbattery_testなどがある。

shortcut keys

  • Reset : Reflesh + 電源ボタン
  • PgUp : Alt-up
  • PgDn : Alt-down
  • Home : Ctrl-Alt-up
  • End : Ctrl-Alt-down
  • Delete : Alt-backspace
  • IME on/off : C-space (US配列)

Developer Modeに入る

  1. 電源OFFの状態でEsc + Reflesh + 電源ボタン
  2. 白い画面でCtrl-dを押す
  3. スペースキーを押さずに待っているとデータの消去が始まる。
  4. 再起動したらCtrl-dを押すか、30秒待つことでChrome OSが起動する。

USBメモリへcroutonをインストール(sid編)

下記エントリを参考にインストール。-mオプションで国内ミラーを選んでおく。

chrome.hatenablog.jp

  1. Ctrl-Alt-tでshellを起動
  2. sudo umount /media/removable/hogefuga
  3. sudo cfdiskLinuxのパーテションを作る
  4. sudo mkfs.ext4 -L chromebook /dev/sda1
  5. USB stickを抜き差しする
  6. GitHubからcroutonをダウンロードする。
  7. sudo mkdir /media/removable/chromebook/crouton
  8. sudo sh ~/Downloads/crouton -r sid -t xfce -p /media/removable/chromebook/crouton -m http://ftp.nara.wide.ad.jp/debian

crouton環境はCtrl-Alt-tのcroshshellと打ってからsudo sh /media/removable/chromebook/crouton/bin/enter-chrootで起動。 Xfceを起動したい場合はsudo sh /media/removable/chromebook/crouton/bin/startxfce4

ただ、現状すんなりとstartx / startlxde4が起動しない。

crosh -> shellから

sudo rm /dev/dri/card0
sudo mv /dev/dri/card1 /dev/dri/card0

すると起動するんだけど、なんじゃこりゃ。

X11 Fails to Start (Chromebook Flip C100, 45.0.2439.4 dev) · Issue #1938 · dnschneid/crouton · GitHub

USBメモリへcroutonをインストール(trusty編)

ubuntu(trusty)の場合はこう。 sh ~/Downloads/crouton -r trusty -t xfce -p /media/removable/chromebook/crouton -m http://jp.archive.ubuntu.com/ports/

こっちはふつうにXが動く。

archlinux ARM

公式ガイドの手順通りにインストール。

インストール後の設定もろもろ。

localeつくる。

  • vi /etc/locale.genen_US.UTF-8ja_JP.UTF-8コメントアウトを外し、locale-genecho LANG=en_US.UTF-8 > /etc/locale.confexport LANG=en_US.UTF-8

タイムゾーン設定。ChromebookのHWクロックはUTC

  • timedatectl set-timezone Asia/Tokyo

パッケージの更新。

  • vi /etc/pacman.d/mirrorlistからミラーを増やす。
  • pacman -Syuでパッケージ更新。

rootのパスワード設定と通常ユーザ作成。

  • passwdでパスワード設定
  • pacman -S sudo
  • useradd -m -g wheel *username*
  • passwd *username*
  • visudoDefaults env_keep += "HOME"%wheel ALL=(ALL) ALLコメントアウトをはずす。

Xorgのインストール。

  • pacman -S xf86-video-armsoc-rockchip veyron-libgl
  • pacman -S xorg-server xorg-server-utils xorg-apps xterm xorg-xclock xorg-twm
  • sudo cp /etc/X11/xinit/xinitrc ~/.xinitrc

 croutonと比較して、本物Linuxが動くのは利点だが、Kernelが古い(3.14)など、自分でメンテを引き受けて貢献しない限り、Archのbleeding edge性は得られないであろうとの判断があり、現時点における結論としてcroutonのtrustyを使うことにした。
 使用感などは追々。取り急ぎ、環境構築まで。

Make: AVR Programming pt.00

 Make: AVR Programmingのために。

必要なもの

今後AVRライフを送る上で必要不可欠なもの

  • ブレッドボード
  • ジャンパワイヤ
  • 電気抵抗
    • LED用 200-500 Ω
    • 1 kΩを幾つか
    • 最低でも5つの10k Ω
  • ISPプログラマArduino
  • Atmel ATmega168/168A/168P/168PA DIPパッケージ
  • USB-シリアル変換器(FTDIのがおすすめ)
  • 色を問わずLED10個と、適切な大きさ(200-500 Ω)の抵抗(抵抗に多すぎるということはない)
  • もしあれば5 Vの直流電源

初級編

  • 8 Ωのいわゆるふつうのスピーカと10-100uFのキャパシタ
  • 2個以上のNormally Openなプッシュボタン(安いタクトスイッチでOK)
  • 最低5個の2N7000 MOSFET
  • 2つのLDR(photoresitor, CDS)
  • 2つのポテンショメーター(可変抵抗、10 kΩが理想だけど1 kΩ以上なら大丈夫)

中級編

  • ピエゾディスク(圧電素子?)
  • サーボモータ
  • 分解していいレーザポインタ
  • I2Cデバイス(本書内ではLM75温度センサを使っている)
  • SPIデバイス(本書内では25LC256 32Kbit SPI EEPROMを使っている)

モータとHブリッジ

  • DCモータ(3-12 Vがいい)
  • Hブリッジを構成するためのMOSFET(本書内ではIRF9530を2つ、IRF530sを2つ使用)
  • モータドライバ SN754410 か L293D
  • ステッピングモータと電源
  • スイッチのようにはたらくデバイス たとえば
  • DC電源で動くデバイス たとえば
  • 5 Vのリレー

おまけ

  • 電圧計
  • アンプ内蔵スピーカー(PC用のものがちょうどいい)
  • はんだごてとはんだ
  • プロトタイプボード

持ってたもの

  • 5 V ACアダプタ

Arduino スターターキットV2

買い足したもの

  • ブレッドボード
  • Atmel ATmega168P
  • USB-シリアル変換器
  • 8 Ωスピーカ
  • 2N7000 MOSFET x 10
  • CDS x 5
  • 10 kΩボリューム x2
  • SWITCH SCIENCE LM75B温度センサ(I2C接続)
  • Atmel AT93C86 16kBit EEPROM

用意