NVIDIAのCUDA10とcuDNNをUbuntu18.04にインストール

### NVIDIAのパッケージレポジトリを追加
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
$ sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
$ sudo apt-key adv –fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
$ sudo apt-get update
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
$ sudo apt-get update

### NVIDIAのドライバーをインストールして再起動
$ apt install ubuntu-drivers-common
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:04.0 ==
modalias : pci:v000080EEd0000CAFEsv00000000sd00000000bc08sc80i00
vendor : InnoTek Systemberatung GmbH
model : VirtualBox Guest Service
manual_install: True
driver : virtualbox-guest-dkms – distro non-free
driver : virtualbox-guest-dkms-hwe – distro non-free

== /sys/devices/pci0000:00/0000:00:02.0 ==
modalias : pci:v000080EEd0000BEEFsv00000000sd00000000bc03sc00i00
vendor : InnoTek Systemberatung GmbH
model : VirtualBox Graphics Adapter
driver : virtualbox-guest-x11 – distro non-free

$ sudo ubuntu-drivers autoinstall
Reading package lists… Done
Building dependency tree
Reading state information… Done
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
virtualbox-guest-dkms-hwe : Conflicts: virtualbox-guest-dkms
E: Unable to correct problems, you have held broken packages.

なんでや、vagrant環境だからか??

グラフィックカードの仕組み

グラフィックカードはGPUが搭載されたボード
3DCGの場合、縦、横、高さ、奥行きなどの位置情報から計算して映像を作り出しており、スムーズに描画するには高性能なグラフィックス機能が必要になってくる
L ゲームは勿論のこと、CADなど3Dソフトにも有効
最近では動画エンコードにグラフィックチップスが使われている
GPGPUとは3D描画以外の用途にGPUを利用する事(物理シミュレーション、デジタル画像処理、ビデオ変換処理、データベース処理などの高速化)
GPUは数十〜数百のコアを内蔵している

### 主流のメーカー
NVIDIA(Geforce)、AMD(Radeon)
MSI, ASUSなどが上記2社からOEMで作っている

### CUDA(Compute Unified Device Architecture)
NVIDIAが開発・提供しているGPU向け汎用並列コンピューティングプラットフォーム
C/C++コンパイラ nvccやライブラリなどが提供されている

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

### 基礎
マザーボードの外形寸法は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

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