[Arduino] LCDを使ってみる

■LCDとは
Liquid Crystal Display 液晶のこと
今回はSD1602H1を利用

使い方のポイント
ピン番号と機能、ArduinoPINの対応表を作っておくとよい
実際のLCDのPIN並び順にも注意

01 VSS GND LCDのGND
02 VDD 5V LCDの動作電源+
03 VO – コントラスト調整
04 RS 12
05 R/W GND
06 E 11
07 DB0 –
08 DB1 –
09 DB2 –
10 DB3 –
11 DB4 5
12 DB5 4
13 DB6 3
14 DB7 2
15 A –   バックライト電源(アノード)
16 K GND バックライトGND

■コード

#include

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
lcd.begin(16, 2);
lcd.print("Hello, world!");
}

void loop() {
lcd.setCursor(0, 1);
lcd.print(millis() / 1000);
}

■BB
20140816-LCD_arduino_BB
■回路図
20140816-LCD_arduino_回路図

[Arduino] 焦電センサを使ってみる

■焦電センサとは
焦電式赤外線センサのこと

温度の変化に応じてあるセラミックの表面に帯電する
電化が増減する焦電効果という現象を利用している。

検出範囲はセンサによって異なる
複数組み合わせたり、筒に入れて狭めたりするとよい

ここではNaPiOn AMN31112 最大検出5mを用いる

■コード

import processing.funnel.*;

final int TIMEOUT = 3000;
final int ONEMINITE = 1000 * 60;
Arduino arduino;
Pin sensorPin;
Pin ledPin;
boolean isActive = false;
int lastActive = 0;

void setup(){
size(500,500);

PFont font = createFont("CourierNewPSMT", 18);
textFont(font);

Configuration config = arduino.FIRMATA;
config.setDigitalPinMode(2, Arduino.IN);
config.setDigitalPinMode(13, Arduino.OUT);
arduino = new Arduino(this, config);

sensorPin = arduino.digitalPin(2);
ledPin = arduino.digitalPin(13);
}

void draw() {
int elapsedTime = millis() - lastActive;
background(0);
text("State: " + (isActive ? "Active" : "Inactive"),10,20);
text("Elapsed time:" + elapsedTime, 10, 50);

if (!isActive && (elapsedTime > TIMEOUT)) {
ledPin.value = 0;
}
// reset elapsedTime
if (elapsedTime > ONEMINITE) {
elapsedTime = 0;
}
}

void risingEdge(PinEvent e) {
if (e.target == sensorPin) {
ledPin.value = 1;
isActive = true;
}
}

void fallingEdge(PinEvent e) {
if (e.target == sensorPin) {
lastActive = millis();
isActive = false;
}
}

■BB
BB 回路図はNaPiOnがなかったため別の焦電センサで代替
(抵抗値も違う可能性大)
20140815-porysensor_processing_BB

■回路図
20140815-porysensor_processing_回路図

[Arduino] サーボモーターを動かしてみる

■サーボモーターとは
Servoの語源はラテン語のServus(召使い)
トルクを発生させるモーター
物体の角度を変えたりするのに用いる
内部に制御機構(抵抗やセンサなど)をもつ

普通のDCモーターとは異なり、
回転数を得る物ではない
消費電流はモーターにかかる負荷によって異なる
無負荷時であれば小さな電流で利用できるため、
プロトタイプなどに用いられる

※注意点
常に指定された角度で静止しようと内部的に力が働いている。
そのため、連続動作は得意ではない。

置き換えはDCモータ+ギア、ステッピングモータなどを用いる
今回は小型サーボのR-90を用いた

■クローズドループ制御
サーボモーターのように、
センサを内蔵して制御する方法のこと
←→オープンループ制御
クローズドループ制御はエラー時の立て直しが可能
■コード(arduino単体)

#include

const int potentiometerPin = 0;
Servo servo;

void setup() {
servo.attach(9);
}

void loop() {
int value = analogRead(potentiometerPin);
// 0 - 179 degree
int angle = map(value, 0,1023,0,179);
servo.write(angle);
delay(15);
}

■BB
20140815-servo_BB
■回路図
20140815-servo_回路図

[Arduino] 赤外線センサを使って距離を測る

■赤外線センサ
非接触で物体との距離を測る方法
今回はPSD(Position Sensitive Detector)を使う
2つの赤外センサを使い、三角測量の原理で測定する
赤外線の反射にする位置によって値が変わる受光素子により、
物体までの距離が抵抗が得られる。

・特長
物体から人体まで幅広く距離をはかれる
モデルによって有効な距離が違う
比較的安価
・注意点
外光に影響を受けやすい
指定距離以下では正しく値がはかれない
電圧と距離の関係はほぼ反比例になる
電流が不安定になることがあるのでコンデンサ付ける

今回用いたもの
シャープ製 GP2Y0A21YK
(測定レンジ10〜80cm)

■コード(Arduino+Processing)

import processing.funnel.*;

Arduino arduino;
Pin sensorPin;
final float THRESHOLD = 0.08;

void setup() {
size(200,200);

PFont font = createFont("CourierNewPSMT", 18);
textFont(font);

arduino = new Arduino(this, Arduino.FIRMATA);
sensorPin = arduino.analogPin(0);
}

void draw() {
background(0);
float value = sensorPin.value;
if (value > THRESHOLD) {
// convert value to cm
// Arduino analog in 0-1023
// Funnel analog in 0-1
int range = round((6787 / (value * 1023 - 3) - 4));
text("Range: " + range + " cm", 10, 20);
} else {
text("Range: OFF", 10, 20);
}
}

■BB
20140815-PSD_Processing_BB
■回路図
20140815-PSD_Processing_回路図

[Arduino] RGB LEDを光らせる

■RGB LEDについて
RGBのLEDがそれぞれ内蔵されているもの
4本足で各色の足と共通端子一本を持つ

□種類
共通端子の種類によって名前、駆動方式が異なる
analogWriteのmapの値が逆になるので注意
・アノードコモン
 共通端子を電源(例5V)に接続
 ピンへのシンク(吸い込み)でドライブする
・カソードコモン
 共通端子をGNDに接続
 ピンへのソース(吐き出し)でドライブする
 Kathodeはドイツ語書き Kと表示することが多い
 Cathodeは英語書き Cがコンデンサと紛らわしい

■接続する抵抗値について
R,G,Bでそれぞれ駆動電圧が異なるため、計算して導きだす
砲弾型であれば 以下の計算により1/4Wカーボン抵抗で十分
 3.3V × 0.02A = 0.06W
色 順電圧 順電流 電流制限抵抗
R  1.8   10mA 330   
G  3.5   10mA 150
B  3.5   10mA 150

■コード

const int rLEDPin = 9;
const int gLEDPin = 10;
const int bLEDPin = 11;

const int rPortPin = 0;
const int gPortPin = 1;
const int bPortPin = 2;

void setup() {
pinMode(rLEDPin, OUTPUT);
pinMode(gLEDPin, OUTPUT);
pinMode(bLEDPin, OUTPUT);
}

void loop() {
int rPortValue = analogRead(rPortPin);
int gPortValue = analogRead(gPortPin);
int bPortValue = analogRead(bPortPin);

analogWrite(rLEDPin, map(rPortValue, 0, 1023, 0, 255));
analogWrite(gLEDPin, map(gPortValue, 0, 1023, 0, 255));
analogWrite(bLEDPin, map(bPortValue, 0, 1023, 0, 255));
}

■図面
20140814-RGB_LED_cathode_BB

■回路図
20140814-RGB_LED_cathode_回路図

[Arduino] 自然光の明るさを測る

■素材(LCDなし版)
Arduino UNO R3 +PC(Firmata+Processing)
BB
CdSセル(5mm)
LED
ジャンプワイヤ5本
抵抗器(330,10kΩ)

■CdSセルとは
 Photoresistorの一種
 硫化カドミウム(CdS)を用いたもの
 光の強度が増加すると電気抵抗が低下する
 
・別名
 光依存性抵抗(LDE Light Dependent Resistor)
 光導電体(Photoconductor)
 フォトセル(Photocell)

■回路
・IN
PIN(5V)–Cds– +–10kR–GND
       |
       +(PIN) Analog IN 0
・OUT
PIN(D PWM 9) — 330R — LED — GND

■ソース(Processing)

import processing.funnel.*;

Arduino arduino;
Pin sensorPin;
Pin ledPin;

void setup() {
size(100,100);

Configuration config = Arduino.FIRMATA;
config.setDigitalPinMode(9, Arduino.PWM);
arduino = new Arduino(this, config);

sensorPin = arduino.analogPin(0);
ledPin = arduino.digitalPin(9);

Scaler scaler = new Scaler(0, 1, 1, 0);
sensorPin.addFilter(scaler);
}

void draw() {
background(255);
}

void change (PinEvent e) {
if (e.target == sensorPin) {
ledPin.value = sensorPin.value;
}
}

■手順
1.回路を組む
2.PCとUSBで接続.Standard Firmataをアップロード
3.ProcessingでRun
4.光から隠すとLEDが強く光る、光があたるとLEDが弱く光る

■+α
チャタリングを取り除く
デジタル値に変換
一定時間経過
値のキャリブレーション(調整)

画像

[Arduino] Digital入力,Analog入力を使ってみる

■デジタル入力
・サンプル
 例>Digital>Button

・プルダウンとプルアップ
 プルダウン…GNDに接続して電圧を引っぱり下げる
 プルアップ…

・sink(シンク) とsrc(ソース)
 シンク…吸い込み。外部からピンに向けて電流を流す
 ソース…吐き出し。ピンから外部に向けて電流を流す

■アナログ入力
・抵抗分圧
 電圧を2個の抵抗器の割合で分けること
 センサはその検知する値によって抵抗値が変化する。
 それを電圧の差として計測することができる。

・ソースコード

const int sensorPin = 0;
const int ledPin = 9;

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

void loop() {
int value = analogRead(sensorPin);
int intensity = map(value, 0, 1023, 0, 255);
analogWrite(ledPin, intensity);
}

・BB
20140814-analogin_BB

・回路
20140814-analogin_回路図

[Arduino] Digital出力,Analog出力を使ってみる

■電子部品まめ知識
・ワイヤ(AWG 24-26, 30cm程度)
 ※Amerikan Wire Gaugeの略
  ケーブルの芯線の太さを表す
  値が小さいほどケーブルが太くなることに注意
  日本では導体直径で表されることが多い
  AWG 22 = 導体直径 0.644mm
  AWG 24 = 導体直径 0.510mm

・抵抗器
 英語では以下を明確に区別する
 resistor 抵抗器 ひょうたん型、物体そのものを示す
 resistance 抵抗 抽象的な概念としての抵抗

■ Analog Write
 PWMによるアナログ出力
 Pulse Width Modulation
 LEDなどはあるしきい値の電圧以上でON,OFFが
 はっきり分かれる(=デジタル出力)が、
 1msecなど高速に明滅させることで
 明るさをアナログのように連続的な変化させられる。

 AnalogWriteは0-255の256段階
 API: analogwrite(ledpin, fadeValue)
 DigitalWriteは0,1の2段階
 API: digitalwrite(ledpin,HIGH)
・AnalogWriteのサンプル
  例>Analog>Fading

・PWM可能なピン
 D3,5,6,9,10,11
 ※Arduino UNO R3には〜のマークがピン横についてる

[Arduino]Funnelライブラリを利用する

■環境
MAC OS 10.9.4
Arduino IDE 1.0.5 インストール済
Arduino UNO R3

■以下のツールを設定する
Funnel
Firmata
Processing

■Funnelライブラリとは
読み方:ファンネル
ArduinoボードとPCを組み合わせて動かすためのライブラリ
フィジカルコンピューティングのためのオープンツールキット
センサやアクチューエータをActionScript 3、Processing、Ruby
といったプログラミング言語で扱うことができるようになる。
Arduino単体で利用する場合は不要だが、
Arduino+PCで利用する場合は必須

■Firmataとは
読み方:ファルマータ
Arduinoボードとの接続に利用するプロトコル
ArduinoIDEに含まれている
1.PCにArduino接続
2.ファイル>スケッチの例>Firmata>StandardFirmataを選択
3.アップデートでOK

■Processing
1.ダウンロード、アプリケーションフォルダにダウンロード
 注意!ver2はProcessing+Firmata+Arduinoに対応してない
    ver2.2.1で失敗した…
    (Processing2の実行時にsetting.arduino.txtでエラーが出る)
    ver1.5.1をダウンロードする!
2.書類/Processingフォルダにlibraries/funnelフォルダを作成
3.funnel/libraries/processingの下のlibrariy/とexamples/を2.にコピー
4.Processingを起動
5.Sketch>ImportLibrary>Contributedのfunnelを確認
6.File>Sketchbook/libraries/funnel/examples/Arduino/Blinkを選択
7.Playボタンを押す→LED点滅を確認
 (通信中LEDが高速明滅する横で1秒間隔でL のLEDが点滅)
 (これでProcessingでFunnelライブラリを使う準備は完了)
8.Stop or pop upを閉じる→通信中ライトが消える
9.USBを抜く

■ダウンロードページ
・Funnel
以下のFeaturedを選択(v1.0 r801)
https://code.google.com/p/funnel/downloads/list

・Processing(v1.5.1)
https://www.processing.org/download/?processing

[Arduino]本体LED点滅サンプルコードを実行する

■環境
MAC OS 10.9.4
Arduino IDE 1.0.5 インストール済

■ポートとデバイスの準備
1.PCとArduinoをUSB A-B経由でつなぐ(ONのLEDが光る)
2.ツール>シリアルポート>/dev/tty.usbmodem-…を選択
3.ツール>マイコンボード>ArduinoUNO を選択

■サンプルコード実行手順
1.PCとArduinoをUSB A-B経由でつなぐ(ONのLEDが光る)
2.Arduinoアプリケーションを起動する
3.ファイル>スケッチの例>01.Basics>Blinkを選択
4.マイコンボード書き込みボタンをおす
 (Command+u でもOK Updateの頭文字)
5.終了はUSBを抜けばOK
  (通信は書き込み時しか行ってないから)

■ポイント
サンプルコードは上書きできないようになっているので、
deley部分をいじれば簡単に端末点滅時間を変更可能