2018年7月4日水曜日

Arduino実習1 - 準備

必要なもの

Arduino Uno R3
TA7291P
nチャネルMOSFET 2SK703
CdSセル GL5516
モータ FA-130RA
ソレノイド
抵抗 100
抵抗 10k
ダイオード
電池ケース
電池 単3 2本
ブレッドボード
USBケーブル
ワイヤ適宜

Arduinoで開発する準備

本家ウェブサイト
https://www.arduino.cc/

IDE(統合開発環境)をダウンロード
https://www.arduino.cc/en/Main/Software
Windows の場合, 右の方にある Windows Installer, for Windows XP and up をクリックし,JUST DOWNLOAD をクリック.でインストーラ実行.

USBケーブルでボードとPCを接続

接続されているポート番号を確認
Windows 10 の場合,スタートボタンの上で右クリック→デバイスマネージャー→ポート (COMとLPT)

Arduinoでできること

デジタル入出力
アナログ入出力
演算
シリアル通信(PCとのデータのやりとり)

さしあたり知っておくべきことはこれくらい.

最初のスケッチ

スケッチ=プログラム

Arduino IDEを起動

setup()に初期化用の処理,loop()に継続的に実行される処理を書く.

一番ありがちなボード上のLED("L"というラベルが付いている)の点滅

ソースコード

int ledPin = 13;

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

void loop() {
  digitalWrite(ledPin, HIGH);
  delay(500); // wait for 500ms
  digitalWrite(ledPin, LOW);
  delay(1000); // wait for 1000ms
}


実行

ツール > ボード: Arduino/Genuino Uno を選択
ツール > シリアルポート: デバイスマネージャーで確認したポートを選択

マイコンボードに書き込む でPCからArduinoにプログラムが転送されて自動的に実行される.

結果

ボード上のLEDが点滅する.

続く→ http://masa-memo.blogspot.com/2018/07/arduino2.html

Arduino実習2 - アナログ入力

センサの情報を入力

センサは物理的・化学的な何らかの量を電気信号に変換します.

センサはおおむね以下のいずれかに分類されます.
  • 抵抗値に変換する
  • 電圧に変換する
  • 電流に変換する
計算機に取り込む場合,アナログの電圧値をデジタルに変換する(A/D変換)が必要です.本実習ではArduinoを用いて行います.センサによっては,センサ内部でAD変換が行われ,SPIやI2Cといった通信規格に則って値を取り出す場合もあります.

明るさのセンシング

センサの例として,明るさをセンシングするCdSセルを使ってみます.入射する光が強くなると抵抗値が低下する素子です.

今回使うものはGL5516
電子部品を使うときにはデータシートに目を通して性質を確認するようにしましょう.CdSセルであれば,抵抗値はどのあたりで,光の強度に対する抵抗の変化はどれほどであるのかを確認します.

一般的に電子部品には極性があるものと無いものがあります.
CdSは極性は無いので,どちらの足を電圧高い方につないでも問題ありません.

Arduinoでは,ANALOG INと書かれたピンA0-A5から,電圧を読み取ることができます.5Vを1024段階,つまり0Vなら0,5Vなら1023の整数値が得られます.得られるのは当該ピンとGND(グランド,アース)との電位差です.

抵抗値を読み取るためには,抵抗値の変化を電圧の変化に変換する必要があります.どうするか?

値が固定の抵抗と直列に接続
全体に一定の電圧を印加
センサの抵抗値の変化によって,二つの抵抗の比が変化し,電圧降下の値が変わる.センサ側の電圧降下を読み取ってもよいし,固定抵抗側の電圧降下を読み取ってもよい.
固定抵抗の大きさをどうするかは,センサの出力の変化範囲に依存.
CdSセルの説明書には,暗所での抵抗(最大値)の10分の1程度と書かれているが,ちょっと大きいように思います.

実習

部品リスト

Arduino Uno R3(互換品)
CdSセル GL5516
抵抗 10k
ブレッドボード
USBケーブル
ワイヤ適宜

回路図

抵抗10kは茶黒橙金.抵抗の読み方は各自検索してください.

ワイヤで配線するとき,色は何を使ってもよいのですが,電子工作の場合,
電源+: 赤
GND: 黒
は守るべきかと.製作者自身が混乱しないように.

プログラム

int sensorPin = A0;
int sensorValue = 0;
int wait = 10;

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

void loop() {
  sensorValue = analogRead(sensorPin);
  Serial.println(sensorValue);
  delay(wait);
}
analogRead()で,GNDと当該ピンの間の電位差をA/D変換した値が得られます.
Serial.println()で値を文字列に変換してシリアル通信でPC側に送ります.
シリアル通信を使う場合には,setup()でSerial.begin(通信速度)が必要です.
PC側ではシリアル通信で送られてきた結果を見ることができます.Arduino IDEでツール > シリアルモニタもしくはツール > シリアルプロッタを使います.

シリアルモニタの出力例: 生のデータを文字列とみなして表示

シリアルプロッタの出力例: 数値データを時系列グラフ化して表示

応用

抵抗値が変化するセンサ(曲げセンサ,圧力センサ,一部の加速度センサなど)にはこのまま応用できます.電圧が変化するタイプならば,電圧の範囲が0から5Vであれば直接analogRead()すればよいです.変化が微小な場合,オペアンプを使って信号を増幅する必要があります.

続く→ http://masa-memo.blogspot.com/2018/07/arduino3-mosfet.html

Arduino実習3 - MOSFETを用いたスイッチング回路

概要

Arduinoなどのマイクロコントローラからの出力では直接駆動できない素子のスイッチングを行うためには,別途電源を用意して,そのOn/OffをArduinoからの信号で制御します.ここでは,広く用いられているパワーMOSFET(Metal-Oxide-Semiconductor Field-Effect Transistor)を利用する方法について解説します.

MOSFET

MOSFETとは,電界効果トランジスタの一種です.ゲート(G),ドレイン(D),ソース(S)という3端子を持ち,ゲートに加える電圧でドレイン-ソース間の電流を制御します.スイッチングが高速で,オン抵抗が低い(MOSFET自身による電圧降下が少ない,発熱量が少ない)という優れた特性を有しています.

MOSFETにはnチャネル品とpチャネル品があり,ドレイン-ソース間の電流の向きが逆になります.nチャネル品では,ドレインからソースに向かって電流が流れます.このときはソース電極に電流が吸い込まれるためシンク(sink)駆動と呼ばれます.pチャネル品では,ソースからドレインに向かって電流が流れます.

スイッチングに使用する際に重要な特性は,まずはゲート閾値電圧です.ゲート-ソース間の電圧がゲート閾値電圧以上になった場合にドレイン-ソース間に電流が流れます.このときドレイン-ソース間の抵抗(オン抵抗)が低いことが望ましいため,この値も確認します.

また正常に動作する限界を確認しておくことも必要です.ドレイン-ソース間に印加できる最大の電圧は,ドレイン-ソース間の降伏電圧を確認します.一般的には実際に使用する際に印加される電圧の,3から5倍の耐圧を持つものを使用するのがよいとされています.ドレイン-ソース間に流すことのできる最大の電流は,ドレイン電流を確認します.

ソレノイド

ソレノイドとは可動鉄芯を有するコイルで,通電により鉄芯を押し出しないしは引っ込めることができます.実習ではソレノイドのOn/Offをマイクロコントローラから制御します.

動作確認

ソレノイドの動作を確認します.実習に使用するソレノイドは5V用ですが,本実習で印加する電圧は3V(単3乾電池2本)としています.これでも動作します.

まずソレノイドの端子に直接電圧を加えて,鉄芯が動作することを確認してください.このとき長時間通電すると盛大に発熱しますので電流を流す時間はほどほどにしましょう.コイルですので極性はありません.電流の向きを反対にしても同じように動作することも確認しましょう.

実習

部品リスト

Arduino Uno R3(互換品)
ソレノイド
nチャネルMOSFET 2SK703
抵抗 100, 10k
ダイオード
電池ケース・電池
ブレッドボード
USBケーブル
ワイヤ適宜

回路図


回路図のQ1はMOSFETです.MOSFETとして2SK703を使用します.形状は下図の左側です.
足は型番が見える向きにして,左からGDSです.回路図での並び順は下図の右の通りDGSなので,並びが異なるので注意.


R1はMOSFETの動作を安定化させる効果があります.

回路全体の電源がOnになった際に,Arduinoからの出力が無い(OnでもOffでもない状態.ハイインピーダンスと呼ぶ)と,MOSFETが不安定になります.R2はゲートの電圧を0VにしてMOSFETがOnでもOffでもない状態になることを防ぎます.ほとんど電流は流れないため,大きな抵抗でよいです.ここでは10kを使います.

V1はソレノイド用の電源で,ここでは乾電池2本を使用します.

ソレノイドと並列に入っているダイオードは,ソレノイドへの通電がオフになった場合に逆起電力が流れて回路を破壊することを防ぎます.なるべくソレノイドの近くに取り付けます.ダイオードには極性があります.

ソレノイドをブレッドボードに接続するときは,さしあたり適当なワイヤをソレノイドのコネクタに突っ込んでください.

ソースコード

int switchPin = 8;

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

void loop() {
  digitalWrite(switchPin, HIGH);
  delay(500); // wait for 500ms
  digitalWrite(switchPin, LOW);
  delay(1000); // wait for 1000ms
}

結果

ソレノイドがカチカチするはずです.

応用

直流で駆動し,高い電圧・大きな電流が必要な素子全般に使用できます.例えば空気圧制御するための電磁弁など.

続き→ http://masa-memo.blogspot.com/2018/07/arduino4-dc.html

Arduino実習4 - ブリッジドライバを用いたDCモータの駆動

解説

DCモータ

DCモータを回転させるためには,Arduinoのピンからの出力では電圧や電流が足りません.ではどうするかというと,モータを回転させるための電源を別途用意し,電流の向きをArduinoから制御します.単なるスイッチングではなく,回転方向を変えるためには電流の向きを,回転速度を変えるためには電圧を制御しなければなりませんが,これらの難しいところをよきにはからってくれるブリッジドライバICを用いることで簡単に実現できます.

使用するブリッジドライバ

TA7291P
https://toshiba.semicon-storage.com/jp/product/linear/motordriver/detail.TA7291P.html

参考になるサイト

回転の向きと速度の制御

TA7291Pには10本のピンがあります.ピン番号は向かって左から1,2,...,10です.

電源として,ロジック側(この場合,Arduinoと同じ電圧)の電源と,DCモータ側の電源を用意します.
1番ピンが共通のGND,7番ピンがロジック側の電源Vcc,8番ピンがモータ側の電源Vsです.

モータは2番ピンOUT1と10番ピンOUT2に接続します.接続を逆にするとモータの回転方向が変わります.

IN1(5番ピン)とIN2(6番ピン)へ以下のようなデジタル信号を入力することにより,モータに印加される電圧を制御します.
IN1=H, IN2=L: どちらかの方向に回転(配線に依存)
IN1=L, IN2=H: 上と逆方向に回転
IN1=H, IN2=H: brake
IN1=L, IN2=L: stop

回転状態において,HのピンにPWM(pulse width modulation)信号を入力すると,IN1=H, IN2=L と IN1=L, IN2=L の状態,つまり回転とstopを高速に切り替えている状態となり,結果として回転速度が下がります.

Vref(4番ピン)は出力電圧を制御するためにあります.回転の速度の制御に関して,VrefにPWM信号を入力せよ,としているサイトが多く見受けられます.これはVcc=Vsの場合はよいのですが,そうでなければ適切ではありません.上述の通り,IN1とIN2のうち,HIGHにしているピンをPWMするのがよいでしょう.ただしデータシートによると,Vrefを使用しない場合は,3kΩ以上の保護抵抗を経由してVsに接続しておく必要があります.

モータを扱う際にも,ソレノイドと同様に停止時に発生する逆起電力に注意を払う必要がありますが,TA7291Pには逆起電力を処理するためのダイオードが内蔵されているため,回路に自身でダイオードを加える必要はありません.

実装

部品リスト

Arduino Uno R3(互換品)
TA7291P
モータ FA-130RA
抵抗 10k
電池ケース・電池
ブレッドボード
USBケーブル
ワイヤ適宜

回路図


VsとGNDの間にコンデンサを入れて電圧を安定化させるべきであるとか,VsとTA7291Pの間に電流制限抵抗を入れるべきであるとか,モータにはコンデンサを付けるべきであるとか,改善すべき点はありますがご容赦ください.

実装上の注意

モーターのリード線の被覆をもう少し剥いた方がよい.ワイヤストリッパを使うべし.


Arduinoのスケッチ

int pinToIn1 = 9;
int pinToIn2 = 10;

void setup() {
  pinMode(pinToIn1, OUTPUT);
  pinMode(pinToIn2, OUTPUT);
}

void loop() {
  // rotate forward
  digitalWrite(pinToIn2, LOW);
  for (int i = 0; i <= 255; i++) {
    analogWrite(pinToIn1, i);
    delay(10);
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(pinToIn1, i);
    delay(10);
  }

  // rotate reverse
  digitalWrite(pinToIn1, LOW);
  for (int i = 0; i <= 255; i++) {
    analogWrite(pinToIn2, i);
    delay(10);
  }
  for (int i = 255; i >= 0; i--) {
    analogWrite(pinToIn2, i);
    delay(10);
  }
}

結果

モータの軸の回転方向,回転速度が時間と共に変わります.

応用

モータだけではなく,双方向に電圧をかけるようなデバイス,例えばペルチェ素子の制御にも利用できます.

2014年2月12日水曜日

Windowsの共有フォルダをubuntuからマウント

https://wiki.ubuntu.com/MountWindowsSharesPermanently
を見ればよい。

マウント先の適当なディレクトリ名をXXXとする。

sudo mkdir /mnt/XXX
sudo apt-get install cifs-utils

~/.smbcredentials内に以下を記述

username=hogehoge
password=fugafuga

chmod 600 しておく。

/etc/fstabに以下を記述。

//192.168.0.1/共有名 /mnt/XXX cifs credentials=/home/ユーザ名/.smbcredentials,iocharset=utf8,sec=ntlm 0 0

sudo mount -aでマウントする。

----

automountしたい。

https://help.ubuntu.com/community/Autofs
を見ればよい。

sudo apt-get install autofs

/etc/auto.master を編集。例えば末尾に以下を追加。

/mnt/XXX /etc/auto.XXX

/etc/auto.XXX は以下の通り。

共有名 -fstype=cifs,credentials=/home/ユーザ名/.smbcredentials,iocharset=utf8,sec=ntlm,file_mode=0644,dir_mode=0755 ://192.168.0.1/共有名

fstabでマウントしているのはumountして、fstabの当該部分をコメントアウトして、autofsをリスタートする。

sudo service autofs restart

これで、/mnt/XXX/共有名 にマウントされるはず。

2014年2月9日日曜日

ubuntuでOpenGLを用いた実行ファイルでランタイムエラー

実行時に以下のランタイムエラーが出る。

Inconsistency detected by ld.so: dl-version.c: 224: _dl_check_map_versions: Assertion `needed != ((void *)0)' failed!

NVIDIAのドライバを入れていると問題になるようです。
リンク時に、明示的に -L/usr/lib/nvidia-319-updates/ のようにライブラリの場所を指定すればよろしい。

http://stackoverflow.com/questions/20007961/error-running-a-compiled-c-file-uses-opengl-error-inconsistency-detected

2014年2月7日金曜日

xubuntu 13.10 + uim + uim-skk

参考にしたサイト

http://www.kaoriya.net/blog/2013/10/18/
http://blog.livedoor.jp/furikku9310/archives/52347683.html

まずSKK辞書サーバ

dbskkd-cdbをインストールする.

sudo apt-get install dbskkd-cdb
sudo /etc/init.d/openbsd-inetd restart

emacs: ddskk

sudo apt-get install ddskk skkdic

最低限の emacs の設定をする.

(require 'skk-autoloads)
(setq skk-server-host "127.0.0.1")
(setq skk-server-portnum "1178")
(setq-default skk-kutouten-type 'en)

uim: uim-skk

sudo apt-get instal im-config
sudo apt-get install uim uim-skk

input methodの切り替え

im-config -l
uimがリストにあることを確認

im-config -c
メニューからuimを選択,設定.
(1)OK (2)Yes (3)uimを選択してOK (4)OK
Xを再起動するためにログアウト.

※上記は,設定マネージャーの入力メソッド(アイコンあり)の方でもできる.

uim-skkの設定

設定マネージャーの入力メソッド(アイコンなし)で環境を設定
全体キー設定1で,[全体]オン に 変換 を追加,[全体] オフ に 無変換 を追加
SKK辞書で,辞書ファイルの代わりにSKKサーバを使用 を選択.
環境変数SKKSERVERは使用せず(チェックを外す).
SKKサーバのホスト名はlocalhostでよい.
個人辞書ファイルは/home/imura/.skk-jisyoのままでよいと思うが
ddskkとの競合はどうなる?確認が必要.

uim-skkで,「.,」と「。、」の切り替えはどうやって行うのか?
ウェブを見ると以下のように書いてある.
~/.uim に次のように記載する.エンコードはEUCにする(とても重要).

(require "japanese.scm")
(define ja-rk-rule
(append '((((",") . ()) ("," "," ","))
(((".") . ()) ("." "." "."))
((("z" " "). ())(" " " " " ")))
ja-rk-rule))

うまくいかないが...?