ウェッブエンジニアの
ローレベル
プログラミング
cho45
自己紹介
www.lowreal.net 仕事はウェブ(Perl, JavaScriptなど)
今回の内容
どんどこ掘っていく感じで
ウェッブアプリ
JavaScript
Perl / Ruby
HTML, CSS
生まれたときから
Lightweight
Language
は自然にあった
参考:
Perl : 1987年生(12月)
cho45: 1987年生(1月)
C言語
言語バインディング用
にしか書かない
一方で
某スーパークリエイター
「なんかドライバなかったから
書いた」
すごい人は下から上まで全部できる
こんな経験はありませんか?
ARM/Linux 用のアセンブリのススメ
なぜ ARM/Linux か?
参考:ARM 実機がない場合
ARM のアーキテクチャ
Linux ABI
ABI とはバイナリレベルでのOSとアプリ間の規則のこと
などを定めている。
ARM Linux ABI
の2つがある。
システムコールの呼びかたとかが普通に違ってる
EABI だけに言及します。
exit するだけのプログラム
obj-dump
gdb でアセンブリもデバッグ可能
簡単!!
しかし何か作る目標がないと
学習のやる気がでない
アセンブリで何を書くか?
ウェブエンジニアなら
ブログツール
簡易 blosxom
ディレクトリを走査し、�テンプレートに従ってHTMLで表示するだけの CGI
アセンブリで書いたものが�ブラウザ上に出てくるのがおもしろい
みちのり
getenv
CGI 書きたいなら必須
Linux におけるメモリ上のプロセスイメージを知らないと書けない
getenv というシステムコールはない
プロセスイメージ
← こういうの
←←←←←← 環境変数はココ!!
getdents
簡易 ls を書く
open/close など含めファイル関係になじむ
低レベルなディレクトリ構造体をいじる
ref. http://lowreal.net/2014/03/16/1
← この部分
メモリ確保せずにアクセスすると
いわゆる SEGV する
その他細かいこと
ファイル読みこみ
文字列置換
数値文字列化
割り算の実装
(ARM にはかなり新しくないと割り算命令がない)
得られたこと
コンピュータへの親しみ!!!
ARM アセンブリオススメです!!
結局書いてみないとわからない
ARM の情報源
第1部
完
第2部
ハードウェアプログラミング
昨今のコンピュータは
外部インターフェイスが RS-232C やプリンタポートから
USB や Thunderbolt などに移り変わり
気軽に使えるとはいいがたいものになった。
我々は長らく、ソフトウェアから気軽に�ハードウェアへアクセスする手段を奪われていた。
Raspberry Pi
スペックの低いパソコン�安い (4000円ぐらい)
そこが重要ではない
GPIO
General Purpose
Input Output
GPIO ↓↓
奪われていた
Input / Output
GPIO ↓↓
GPIO ↓↓
echo “high” > /sys/class/gpio/gpio23/direction
とりもどした
ファイルシステム経由で
GPIO ピンの論理を変更できる
0V ←→ 3.3V
ただし余り電流を流せないので、
電子回路の知識が必要
“トランジスタ スイッチング” とか
“FET スイッチング” とかでググる
Raspberry Pi は 3.3V
1ピン最大16mA / トータルで最大50mA
参考: 赤LED1つで10〜20mA程度
もっと簡単に楽しむには
周辺機器とのハードウェアプロトコルを知る
I2C
I2C
2線式プロトコル
1つのバスを複数のデバイスで共有できる
バス上の全デバイスがマスターとなれる
いろんなモジュールが出ているので便利
繋ぐだけなので電子回路の知識は殆どいらない
(電圧だけ注意)
I2C デバイスの例
温度計・湿度計・気圧計・モータードライバ
キャラクタ液晶ディスプレイ
ジャイロ・時計(RTC)・デジタルコンパス
など
I2C 使いかた
Linux にドライバを組込めば
ファイルシステムからアクセス可能
LL で簡単にアクセス可能
どんなプロトコルか? は仕様を読む
機器ごとにアクセス方法が違うので
データシートを読む
使いかたの例: ファイルシステム (i2c-dev)
open / ioctl / read / write / close あたりを使う
簡単な書きこみ例
使いかたの例: ruby-i2c-devices
https://github.com/cho45/ruby-i2c-devices
i2c-dev または sysfs gpio による bit banging のラッパー
一部デバイスについては簡単に使える
ruby-i2c-devices + MPL115A2
気圧計
工場校正値を取得して、ちょっと計算する必要がある
ライブラリで隠蔽してるので
すぐ hPa (ヘクトパスカル) とれる
I2C と GPIO
を使えれば楽にいろいろできる
その他のキーワード: SPI, Serial (RS-232C)
ところで
最近は Arduino というのもきく
Raspberry Pi と Arduino の違い
Raspberry Pi
CPU: 32bit ARM 700MHz
メモリ: 512MB
OS: Linux
スペック低いパソコン
Arduino
CPU: 8bit AVR 16MHz
メモリ: 2kB (ATmega328)
OS: なし
使いやすいマイコン
マイコン
→ マイクロコントローラ
組み込み機器で使われる小さなコンピュータ
ファームウェアを書きこむと、基本単独で動作する
できることは少ないが、パソコンとは用途が違う
(消費電力・CPUクロック同期など)
Arduino は実情的には
いい感じマイコンボード + 開発環境 (IDE) + エコシステム
といえる
Arudino スケッチ
IDE + C like な独自文法
シールドと呼ばれる
外部連携ボードがいろいろ出てる
Arduino は
入門にはいいが、ちょっと高すぎる
1台 2000円〜3000円
謎言語みたいなの嫌い
なので Arduino の話は
しない
ところで
Raspberry Pi と Arduino の違い
Raspberry Pi
CPU: ARM 700MHz
メモリ: 512MB
OS: Linux
スペック低いパソコン
Arduino
CPU: AVR 16MHz
メモリ: 2kB (ATmega328)
OS: なし
使いやすいマイコン
Raspberry Pi と Arduino の違い
Raspberry Pi
CPU: ARM 700MHz
メモリ: 512MB
OS: Linux
スペック低いパソコン
Arduino
CPU: AVR 16MHz
メモリ: 2kB (ATmega328)
OS: なし
使いやすいマイコン
Raspberry Pi に
OS は必要か?
bare metal
こんなかんじ (Lチカ)
やってみた2
https://github.com/cho45/raspberrypi-mruby-bare-metal
mruby を OS レスで直接動かし、
GPIO を操作
→ LL が直接ボードで動いている
こんな感じ
実際に動かしてみるとおもしろい
ARM アセンブリの知識が生きます
ただ、開発が大変…
キーワード: (JTAG, オンチップデバッグ)
得られたこと
第2部まとめ
第2部
完
第3部
もっとローレベルへ
Raspberry Pi
は
I/O を解放した
しかし
我々は
まだ
囚われている
第3部
〜ホストコンピュータからの《解放》〜
Arduino は単体でも動く
中身は AVR というワンチップマイコン
電源があれば単体で完全に動く
AVR
Arduino なんか捨てろ!!!
ATmega328P 250円
ATmega168P 200円
ATTiny2313 150円
ATTiny13A 50円
いろいろあって楽しい
ただし初期費用としてライターに金がかかる
(3200円ほど)
チップ側と指定通り結線し、�USB経由で書きこむためのインターフェイス
もっと安くあがる方法もあるが
無難にこれぐらい買っといたほうがいい
Mac で問題なく開発可能です
普通にCで開発可能
gcc
ただしコードサイズやメモリはそこそこ厳しい
gcc
普通のエディタで開発
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc gcc
コンパイル
↓
書きこむ
↓
動かす
をループして開発
Raspberry Pi と違い
1ピン 40mA まで出力できる
ATmega 系なら I2C 装備
こんな感じのコード (Lチカ)
Raspberry Pi ではできないことも…
アナログセンサーを読みたいときには必須
ただ、使いこなすにはアナログ回路の知識が必要
初期につくってみたもの
エレキー (for Ham Radio)
モールス符号を正確に打ちだすための
補助装置
1:3 の符号を正確に出力する
出力がただのon/offなので習作に最適
こういうの
いくつか作った
このぐらいの回路だと全部品の挙動を理解しながら作れる
コード書いた結果が
直で消費電力に直結する
プログラミング
電流計る
↓
コード変える
↓
電流変わる
↓
ウケる
基本CPUを使いきることしか考えてない
↓
いかにCPUを使わないかという新鮮さ
プログラマなら
マイコン使いこなすのも簡単
世界が広がっておすすめです
自由を手にし身軽になった身体で
再びホストコンピュータと出会う
I2C を使えば Raspberry Pi とは簡単
しかし Raspberry Pi からも解放されたい
AVR で USB デバイス
USB 対応の AVR もあるが
V-USB (GPL) で安いAVRを
USB 対応にできる
作ってみた: 振動するだけのマウス
接続するとポインタが震えるだけ
V-USB のサンプルをちょっといじっただけ
一瞬でできる
こういうの
V-USB 用のスケルトン
周辺機器も自由に作れるようになり
完全に解放…
しかし
まともな周辺機器を作るには
電子工学の知識が必須
必要な知識
デジタル回路中心なら覚えることは少ない
プログラムの考えかたを活かす
→ ほとんどプログラム書くのと変わらない
ルールが物理ベースになっただけ
勉強中
完全解放までの道程は遠い
つづく…
まとめ
電子回路も
プログラムと同じように
学べば学ぶほど実になる分野
最近は個人でハード設計もしやすい
基板外注
3Dプリンタ
など
プログラミング初めたころのように
「毎日できることが増える!」という体験を
もう一度したいならオススメです
外注自作基板に部品のせたところ
まずは…
RaspberryPi + I2C モジュール
次に
Arduino または AVR
欲を出して
回路・基板設計
広告
電子工学学ぶついでに、
アマチュア無線を初めました
(コールサイン JH1UMV)
twitter: @JH1UMV
モールスの練習をしておりますので
よろしくお願いします