[Arduino]PC電源でミニ四駆を動かしたい

とりあえずモータが届いたので、ミニ四駆のモータ電源をarduinoから供給できるようジャンプワイヤーを無理やりミニ四駆に接着します。

dav

単三電池だと上手く動くが、arduinoだと動かないのは何故だろう??
Arduinoのデジタルピンの電流は40mAなので、どうやらモーターで必要な200mAに足りていないらしい。

※tech specのDC current per I/O Pinってところが出力電流らしい。

電流を増幅するにはトランジスタを使うみたいね。
ん? また部品買うのか? 全然進まねー、もうやだああああああああああああああああああああ

### 考察
ミニ四駆をマイコンで制御する場合、モーターのオンオフや回転数ぐらいしか制御できない
右折、左折をコントロールするには前輪タイヤにステアリング機能を付けないといけない
※ミニ四駆では前輪、後輪共に直線
ステアリングは、arduinoの電圧を変えると、向きが左右に動くようにしなければならない
モータを制御できるということは、他の駆動系(電車、飛行機、ドローンなど)も理論上はarduinoで動かせるが、ステアリング同様に、その仕組みを作るらなければならず、機能を理解して資材をゼロから用意してハードルが高い
一通り部品を用意していざ動かしてみても、問題が発生し、それが部品に起因している場合は、また資材を買わなければならず、時間がかかる
ステアリング付きのミニ四駆にカメラを装着すれば、理論上は自動運転も不可能ではない筈

### 対策
自分で想像して作るよりも、完成物を分解して作った方が時間の節約になる

しかし、ミニ四駆って、自分が子供だった頃と殆ど変わってないけど、この仕組みをこの低単価で提供しているTAMIYAは偉大な会社なんだと理解しました。

[Arduino] ミニ四駆を制御したい

Arduinoでミニ四駆を制御したい、ということで、秋葉原のスーパーラジコンでミニ四駆を久し振りに購入してきました。

dav

あれ?
ミニ四駆って、モーターが入ってないのね。。
あと、arduinoを単三電池の電源で動かすにはDCプラグか1ポートモバイルバッテリーが必要なのね。

またかよ、部品がなくて足踏みするの嫌になるわ。
とりあえずミニ四駆だけ途中まで作ります。

[Arduino] 振動センサー

const int sPin = A0;

void setup() {  
  Serial.begin(9600);
}

void loop() {
  int sValue = analogRead(sPin);

  Serial.println(sValue);

  delay(750);
}

シリアルモニター
184
274
1023
0
1023
0
1023
0
1023
0
1023
0
1023
0
1023
0
1023
0
1023
0
1023
0
1023
0
1023
0
1023
69
930

うーむ、ちょっと期待している値ではないな。

[Arduino] Pretenderをスピーカーを鳴らしたい

まずドレミ

#define BEATTIME 200
#define SPEAKER 13

void setup() {  
}

void loop() {
  tone(SPEAKER, 262, BEATTIME); // ド
  delay(BEATTIME);
  tone(SPEAKER, 294, BEATTIME); // レ
  delay(BEATTIME);
  tone(SPEAKER, 330, BEATTIME); // ミ
  delay(BEATTIME);
  tone(SPEAKER, 349, BEATTIME); // ファ
  delay(BEATTIME);
  tone(SPEAKER, 392, BEATTIME); // ソ
  delay(BEATTIME);
  tone(SPEAKER, 440, BEATTIME); // ラ
  delay(BEATTIME);
  tone(SPEAKER, 494, BEATTIME); // シ
  delay(BEATTIME);
  tone(SPEAKER, 523, BEATTIME); // ド
  delay(BEATTIME);
}
dav

おお、なんやこれは?

### tone()の音階

Official髭男dism・Pretenderをarduinoで演奏したい

#define BEATTIME 200
#define SPEAKER 13

void setup() {  
}

void loop() {
  tone(SPEAKER, 262, BEATTIME); // ド
  delay(BEATTIME);
  tone(SPEAKER, 247, BEATTIME); // シ
  delay(BEATTIME);
  tone(SPEAKER, 220, BEATTIME); // ラ
  delay(BEATTIME);
  tone(SPEAKER, 330, 600); // ミ
  delay(BEATTIME);
  tone(SPEAKER, 220, BEATTIME); // ラ
  delay(BEATTIME);
  tone(SPEAKER, 247, 400); // シ
  delay(BEATTIME);
  tone(SPEAKER, 220, BEATTIME); // ラ
  delay(BEATTIME);
  tone(SPEAKER, 247, BEATTIME); // シ
  delay(BEATTIME);
  tone(SPEAKER, 262, BEATTIME); // ド
  delay(BEATTIME);
  tone(SPEAKER, 247, BEATTIME); // シ
  delay(BEATTIME);
  tone(SPEAKER, 220, BEATTIME); // ラ
  delay(BEATTIME);
  tone(SPEAKER, 175, BEATTIME); // ファ
  delay(BEATTIME);
  tone(SPEAKER, 220, BEATTIME); // ラ
  delay(BEATTIME);
}

あれ、4フラットだとドレミってどうなるんだっけ??
ああああああああああ、楽譜の読みかた忘れたー

[Arduino]LEDライトを交互に光らせる

void setup() {
    pinMode(12, OUTPUT);  
    pinMode(13, OUTPUT);    
}

void loop() {
  digitalWrite(12, HIGH);
  digitalWrite(13, LOW);
  delay(1000);
  digitalWrite(12, LOW);
  digitalWrite(13, HIGH);
  delay(1000);
}
dav

これは触ってる内に色々な想像力が沸き立ちます。
バッチ処理はcronをまず思い浮かびますが、電子空間だけでなく、物理空間のあらゆるものが制御できそうな気がしてきました。

[kernel]割り込み

効率のよい方法は、リクエストを送った後、より有益な他の仕事をしながら、 リクエストが完了した時点でデバイスから割り込みを受けるという方法
CPU の物理ピンのいくつかは、そのピンに電圧の変化が生じると、CPU の現在の処理が中断され、割り込みを処理をする特別なコードである割り込み処理コード(interrupt handling code)の実行が開始されるように設計されている
それらのピンのひとつはインターバルタイマーに接続され、千分の一秒ごとに割り込みを受けられるようになっていて、それ以外のピンが SCSI コントローラのような システム上の他のデバイスに接続されている
ハードウェア割り込みが発生すると、CPU は、現在実行中の命令の実行を停止し、 割り込み処理コードそのものか、あるいは割り込み処理コードへと分岐する命令のどちらかを含んだメモリ内のある場所へとジャンプ
割り込みに優先順位を付けているので優先順位の高い割り込みは起こり得る
Linux は、一群のポインタを使って、システムの割り込み処理ルーチンのアドレスを持つ各データ構造体を参照する

[kernel]マルチプロセッサ

物理メモリを共有して管理するメモリ共有型並列コンピューティング方式のこと
特定のCPUに非対称的に割り付けられた処理に依存することなく、全てのCPUに対して対称的、均一的に処理が割り付けられた並列処理方式
二つ目以降のCPUの起動は、一つ目のCPUがカーネル初期化関数(start_kernel関数)の一番最後に呼び出す関数 smp_init関数にて行われる
二つ目以降のCPU上で動作する初期化プロセスは処理が終了するとそのままアイドルプロセスへと変化する。その後は、スケジューラによりプロセスが割り当てらられるのを待ち続ける

[kernel]ネットワーク(TCP/IP)

IP:16.42.0.9

ネットワークアドレス:16.42
ホストアドレス:0.9

サブネットアドレス:16.42.0
ホストアドレス:9

IPアドレスはネットワーク管理者によって割り当てられる
16.42.0と16.42.1というようにサブネットを変える

IPアドレスはIPパケットに含まれている
送信元、送信先のIPはIPヘッダに含まれる
同一のIPサブネットのホスト間では直接IPパケットを送信できるが、それ以外はゲートウェイに送信

TCPはパケットの送受信のためにIPを使用する
IPアドレスだけでなく、アプリケーションのポート番号も指定しなければならない

### linuxのnetwork
Network Application: user
Socket Interface: BSD Socket, INET Sockets
Protocol Layer: TCP, UDP IP
Network Devices: PPP, SLIP, Ethernet

TCPパケットは番号付けされているので、送信されたデータが正しく受信されたか確認する

### BSD Socket Interface
UNIX, INET, AX25(アマチュア無線)、IPX、APPLETALK, X25
Soket type: Stream, Datagram, Raw, Reliable Delivered Messages, Sequenced Packets, Packet

### INET Sockets
インターネットアドレスファミリーをサポート
システムコールで新規ソケットを作成する際は、アドレスファミリ、ソケットタイプ、プロトコルに関する識別子を渡す

INET BSD ソケット上でコネクションを確立
ふたつのアプリケーション間で仮想サーキットを構築する
TCP セグメントには、コネクション情報、開始セグメントのシーケンス番号(sequence number)、接続を開始したホスト側が処理できるセグメントの最大サイズ(maximum segment size, MSS)、送信および受信の際のウィンドウサイズ(window size)、等が含まれる

待機(listen)状態のソケット上のaccept操作ルーチンは、その socket データ構造体から、新規のsocketデータ 構造体を複製

### IP層
socket buffer:ソケットバッファもしくは sk_buff を使用してプロトコル間やネットワークデバイスとの間でデータを受け渡し
head, data, tail, end
sk_buff: push, pull, put, trim

[kernel]ファイルシステム

記憶装置上のデータに対し、ファイルという形式を通し一貫したアクセス手順を提供、バイトストリーム
ファイルにiノードと呼ばれるデータ構造を割り当てて管理する
各iノードはそのファイルの属性やファイルの実体が置かれている2次記憶装置上のブロック番号などを管理している

目的のファイルのパス名を指定してシステムコールを発行すると、ファイル記述子と呼ばれるユニークな番号が返却される
ファイル記述子の0, 1, 2は特別なファイル記述子として扱う、標準入力、標準出力、標準エラー

ファイルアクセスを高速化するために、各種データをメモリ上にキャッシュする
ページキャッシュはファイルデータそのものをキャッシュ、先行読み出し機能も備えている

仮想ファイルシステム(VFS)をサポートしている
ext2, ext3, iso9660, nts, RPC

### ローカルファイルシステム
ローカルファイルシステムは、ホストに直結された2次記憶装置を利用するためのファイルシステム
Linux標準のファイルシステムExt2のほかに、さまざまなOSが利用しているファイルシステム形式にも対応

### ネットワークファイルシステム
ネットワークの先にある遠隔マシンが持つファイルシステムを、自ホストのローカルファイルシステムのように利用できる仕組

### 擬似ファイルシステム
記憶装置上にあるファイル以外のものを、さもファイルであるかのように見せかけるファイルシステム

### Linux標準ファイルシステムExt2
UNIXが誕生した当時のファイルシステムに、BSDのFFS(Fast File System)の考え方を一部取り込んだような構造

### ジャーナリングファイルシステムExt3
Ext2ファイルシステムにジャーナリングを付加したファイルシステム
耐故障性を高めることと、システムの異常終了後のファイルシステム復旧を高速化するために導入

### ブロック型デバイス
実際の入出力処理を行うのがブロック型デバイスドライバ