マザーボードの配置と仕組み

### 基礎
マザーボードの外形寸法はATXやmicroATXといった規格が定められている、更に小さいMini-ITX
ハードディスク、光学ドライブ(CD, DVD, BlueRay)、バッテリー、CPUファンなどを配置する
BIOSはOSよりも早く起動するソフトウェアで、パソコンに接続された周辺機器を制御する
マザーボードの電源はbiosに電源を供給する
メモリースロット、拡張スロット(グラフィックカード、ネットワークカード、サウンドカードなど)、SATAポート(IDEの次に登場した新規格)など拡張性を備えている
 L グラフィックカードのメーカーはZOTAC、EVGA、NVIDIA、ASUS、MSIなど
 L コンピュータネットワーク内でコンピュータ間の通信を行うために使用される
 L サウンドカードは音響信号の入出力機能を付加または強化する拡張用の回路基板
チップセットは以前はノースブリッジ(グラッフィックカード、メインメモリ)とサウスブリッジ(HDD、USB、光学ドライブ)があったが、ノースブリッジはCPUが担当するため、現在はサウスブリッジのみ
チップセットは集積回路の集まり、CPUの外部バスとメモリや周辺機器を接続する標準バスとのバスブリッジなどの機能を集積

### 各部品
– CPUソケット: LGA1155、LGA1150、LGA1151など
– メモリースロット
– チップセット
– 拡張スロット: PCI-E×1、PCI-E×16、PCIスロット
– SATAコネクタ
– メイン電源
– CPU電源
– BIOS電源
– CMOSクリアピン
– フロントパネルコネクタ
– USBコネクタ
– スピーカー端子
– CPUファンコネクタ
– ケースファンコネクタ
– SATA IIIポート
– USB3.0コネクター
– 外部コネクタ: LANポート、USB2.0ポート、オーディオコネクタ
– アナログRGB、VGA
– ディスプレイ端子: VGA, DVI, HDMI、DisplayPort
– 8チャンネルオーディオポート
– M.2スロット
– I/Oパネル

### メーカー
ASRock、SuperMicro、Intel、GIGABYTE、ASUS、Tyan

マザーボード作ってる会社って、接続機器の仕組み・機能を全て理解してるって事か。。。
どうなってんだこれ、尋常じゃなく凄すぎんだろ。

DDR4 DDR3 DDR2の違い

– DDR4メモリはランダムアクセスメモリの最新世代
L メモリは各世代ごとに速度と周波数が向上している
L メモリの各世代によって電気パラメーターが異なる
– DDR2(1.8V)はXP,Vista, DDR3(1.5V)はWindows 7、DDR4(1.2V)はWindows 10
– ダブルデータレートメモリは、クロック信号の上昇端と下降端の両方でプロセッサーにデータを転送する
– クロック信号は、ダウンビートとアップビートの両方で構成される
– ダブルデータレートメモリの速度はデータ転送に単一端のみを使用するシングルデータレートメモリに比べ大幅に高速
– メモリーに取り付けられている金属製のものをヒートスプレッダという

### DRAMメーカー
Samsung(約45%シェア), SK Hynix(韓国 約28%), Micron(約23% Crucialシリーズ), Nanya(台湾), Winbond(台湾), Powerchip(台湾)

### 設計
– DDR4-2400、DDR4-2666などを チップ規格、PC4-19200やPC4-21300などを モジュール規格
– メモリ基盤にメモリチップを半田付けする
L メモリチップは集積回路であり、各チップ上にはさまざまなトランジスタ、抵抗、およびコンデンサが形成されている

メモリチップもCPUのように論理回路を設計してシリコンから作られているのか。。
つまり、メモリ、CPU、マザーボードにしろ、何やるにしろ集積回路、回路設計の知識が必須と言う事か。。
Godem

電気回路: 正弦波(サイン波)交流に対する回路素子の振る舞い、インピーダンスという概念理解
制御工学: 任意の入力(例えばステップ波形など)に対する回路の応答を解析
アナログ電子回路: トランジスタの構造や特徴を理解、信号増幅の原理の理解や小信号解析といった手法

やればやるほど勉強しなきゃいけない事多すぎんな

[Raspberry Pi]webブラウザからLEDを点灯

SourceForge.netというサイトに行きます。
https://sourceforge.net/projects/webiopi/files/

WebIOPi-0.7.1.tar.gzをダウンロードします。

# tar xvzf WebIOPi-0.7.1.tar.gz
# cd WebIOPi-0.7.1
# sudo ./setup.sh
# sudo /etc/init.d/webiopi start
[ ok ] Starting webiopi (via systemctl): webiopi.service.
# ip a
http://192.168.100.108:8000/

ユーザ名 webiopi パスワード raspberry

192.168.100.108 により途中で接続が切断されました。
ERR_CONTENT_LENGTH_MISMATCH

ん? 何故だ?

[Raspberry Pi]web cameraを使ってみる

ztc00 超小型ビデオカメラをUSBに接続します。

# lsusb
Bus 001 Device 004: ID 1bcf:0005 Sunplus Innovation Technology Inc. Optical Mouse
Bus 001 Device 027: ID 05e1:0b01 Syntek Semiconductor Co., Ltd
Bus 001 Device 005: ID 413c:2107 Dell Computer Corp.
Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

# sudo apt-get -y install fswebcam subversion libjpeg8-dev imagemagick
# svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
# cd mjpg-streamer; make

# sudo fswebcam sample.jpg
— Opening /dev/video0…
stat: No such file or directory

dav

あれ、認識してない、何でだろう??
ただ、ラズパイでビデオ、カメラ接続が容易にできることがわかった。
シェルで条件に合致したときにfswebcam sample.jpgを打ち込めばいいわけだ。
ほぼイメージができてきた。

[Raspberry Pi]LEDを点滅2

#!/bin/sh
gpio_number=25
echo "${gpio_number}" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio${gpio_number}/direction

echo "1" > /sys/class/gpio/gpio${gpio_number}/value
sleep 5
echo "0" > /sys/class/gpio/gpio${gpio_number}/value
echo "${gpio_number}" /sys/class/gpio/unexport

root@raspberrypi:/home/pi# sudo sh led.sh
25 /sys/class/gpio/unexport

期待通りに動きます。

[Raspberry Pi]LEDを点滅

ターミナル
pi@raspberrypi:~ $ sudo -s
root@raspberrypi:/home/pi# echo “14” > /sys/class/gpio/export
root@raspberrypi:/home/pi# echo “out” > /sys/class/gpio/gpio14/direction
root@raspberrypi:/home/pi# echo “1” > /sys/class/gpio/gpio14/value
root@raspberrypi:/home/pi# echo “0” > /sys/class/gpio/gpio14/value

dav

続いて、shを使ってLチカ

#!/bin/sh
echo "14" > /sys/class/gpio/export
echo "14" > /sys/class/gpio/export

while true
do
	echo "1" > /sys/class/gpio/gpio14/value
	sleep 0.5
	echo "0" > /sys/class/gpio/gpio14/value
	sleep 0.5
done

root@raspberrypi:/home/pi# chmod +x led.sh
root@raspberrypi:/home/pi# sudo ./led.sh

なるほど、ラズパイはgpioを/sys/class/gpio/*で操作するのか
Lチカの環境構築はarduinoよりもハードル高いように感じるけど、コマンドラインで操作できると何故か安心感あるな

[Arduino]初めてのロボットを作ろう

意欲的な金融マンがゼロから銀行を作りたいと思うのと同様、エンジニアであれば自分で独自のOS、プログラミング言語(コンパイラ)、CPU、ロボットを作りたいと思うだろう。

ロボットというとガンダムのモビルスーツのイメージが先行してしまうのだが、ブログでPMCをやるなんて宣言するのは問題がありすぎる。
一つの目標値として産業用ロボットがあるが、その他にも例えば家電量販店で陳列されている商品群はロボットとは言えないかもしれないがマイコンで制御されている商品が殆どである。したがって、どの分野を取り組むかは慎重に考える必要がある。

とは言え、最初は簡単なところから始めるのが鉄則。ということで、ブレッドボードを使って簡単なロボットを作りたい。

– LEDで「目」を光らせる
– スピーカーを「口」の機能とする
– temperature sensorを「鼻」と見立てて温度を測り、それによってスピーカーを制御する
– 「足」の機能としてDCモーター機能を付ける

イメージを配置

dav

続いて、目のLED部分の実装

dav

そして、口となるスピーカーの実装
これでドレミと喋るようになります。

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

void loop() {
  digitalWrite(13, HIGH);
  tone(10, 262, 200);
  delay(1000);
  tone(10, 294, 200);
  delay(1000);
  tone(10, 330, 200);
  delay(1000);
}
dav

続いて「鼻」にあたる気温センサーの実装
25℃以上なら、喋るようにします。
温度センサーはosoyoのモジュールを使います。
https://osoyoo.com/ja/2015/03/11/ds18s20-temperature-sensor-module/

#include <OneWire.h>
int inPin = 7;
OneWire ds(inPin);

void setup() {
  Serial.begin(9600);
  pinMode(13, OUTPUT);
}

void loop() {
  int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  if(!ds.search(addr)){
    ds.reset_search();
    return;
  }

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);
  
  
  delay(1000);

  present = ds.reset();
  ds.select(addr);
  ds.write(0xBE);

  for(i = 0; i < 9; i++){
    data&#91;i&#93; = ds.read();
  }
  Serial.print("Temperature:");
  LowByte = data&#91;0&#93;;
  HighByte = data&#91;1&#93;;
  TReading = (HighByte << 8) + LowByte;
  SignBit = TReading & 0x8000;
  if(SignBit){
    TReading = (TReading ^ 0xffff) + 1;
  }
  Tc_100 = (6 * TReading) + TReading / 4;
  Whole = Tc_100 / 100;
  Fract = Tc_100 % 100;
  if(SignBit){
    Serial.print("-");
  }
  Serial.print(Whole);
  Serial.print(".");
  if(Fract < 10){
    Serial.print("0");
  }
  Serial.print(Fract);
  Serial.print(" C\n");

  digitalWrite(13, HIGH);
  
  if(Whole > 26){
    tone(10, 262, 200);
    delay(1000);
    tone(10, 294, 200);
    delay(1000);
    tone(10, 330, 200);
    delay(1000);  
  }
}
dav

そして最後に「足」として、DCモータを3.3v -> GRDで付けます。

dav

おおお、一応、動いている^^
モーターを使った駆動系の処理は力学、電気学など勉強が必要そうだが、色々できそうなことはわかった。

arduinoでロボットを作る?

各社産業用ロボット

ABB社
https://new.abb.com/us

ファナック
https://www.fanuc.co.jp/

川崎重工業
https://www.khi.co.jp/

安川電機
https://www.yaskawa.co.jp/

KUKA
https://www.kuka.com/

### メモ
– 産業用ロボット大手はABB、ファナック、川崎重工業、安川電機、KUKAでアーム型が殆ど
– ロボットに機械学習を実装するのは当たり前になっている
– 赤外線、音声出力、撮影、家電操作、音声認識、顔認識、巡回機能、ARなど多様な機能を組み込んでいる
– 二足歩行ロボットはZMPなど歩行制御のアルゴリズムがある
– 足は電動モータなどのアクチュエーターで動かしている。更に脚部にバネを入れるなどして動作安定化という課題も克服しなければならない。

歩行ロボットはかなり難しそうか。。。

[Arduino]土壌湿度検出モジュール

ポトスという観葉植物を購入して、土壌湿度を検証します。

void setup() {
  Serial.begin(9600);
  pinMode(3, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  int val, val_old;
  val = digitalRead(3);
  digitalWrite(13, val);
  val_old = 1023-analogRead(0);
  Serial.print("Moisture Sensor Value:");
  Serial.println(map(val_old, 0, 1023, 0, 100));
  delay(100);
}

dav

シリアルモニター
Moisture Sensor Value:31
Moisture Sensor Value:30
Moisture Sensor Value:30
Moisture Sensor Value:30
Moisture Sensor Value:31

コレを作ると、農作物の温度、湿度管理のイメージが大分沸きます。