top of page

 出力装置 

  コンピュータは記憶して計算することができます。結果を知るためには人間にわかるような出力が必要です。

​ 点灯消灯によって状態を示します。電球はf日ラメントに電流を流すことにより温度を高めて,発熱による高温で光を発する器具です。光と熱を出力します。

​ 点灯消灯によって状態を示します。電球より消費電力が少なく,反応速度が速く動作をします。

​ 点灯消灯だけでなく数字を表示することで品減に分かり易い出力となります。

 8×7segLED 

 8桁7segLED表示器は2種類あります。一つは純粋に7segLEDが一列に8個並んだもの,もう一つがTM1638を使ったものなどです。

 TM1638 

アンカー 1

​2017年7月29日(土)

 7segLEDはpinが10本,内コモン(アノードかカソード)が2pin後はセグメントとドットです。pin数が多いので配線もたいへん手間がかかります。

 中央左に見えるsopがTM1638です。この基盤のために設計されたICなのでしょうか?機能を十分に果たしています。

 7segLEDはpinが10本,内コモン(アノードかカソード)が2pin後はセグメントとドットです。pin数が多いので配線もたいへん手間がかかります。TM1638を使うと配線は5本で済みます。

​ 使い方を覚えなければなりませんが配線は楽になります。

​ 7segLEDだけのものと価格はあまり変わりません。お得感のあるモジュールです。

 コネクタと配線 

アンカー 1

  VCCは5V,GNDは0Vに接続します。電源です。3.3Vでも動作します。

 STBはStrobe(写真のストロボと同じでストァーブと発音します)です。Lの時だけ動作します。ストロボと同じです(光った時だけ見えます)。

 CLKはClockで動作のタイミングです。立ち上がりの時に動作します。

 DIOはDigital Input Outputですデータを通信します。

​ この3本の信号線をデジタルpinに繋ぎます。どこでもいいのですが今回はDIO8,CLK9,STB10にします。順番を間違えないように良く覚えておきます。

 Arduinoと接続 

 Arduinoと配線してスタンバイです。

 コマンドとデータの送信です。

TM1638データシートより抜粋

 CLKは立ち上がりのタイミングでデータを入力します。STBLの​間だけデータ入出力が有効になります。

 コマンド1はディスプレイモードです 

TM1638データシートより抜粋

 B5,B4は何でもよいということなので0とします。すると,上位4bitは0x8となります。

 下位4bitのうちbit3は1表示するか2しないかを表します。bit2.1.0で表示の明暗を示します1/16~14/16までの8段階です。

​ 0x88~0x8Fまでの8段階です。

 コマンド2はDATAの内容です。 

TM1638データシートより抜粋

 B5,B4は0とします。上位4bitは0x4となります。B0は0,B1は1入力0出力,bit2は1固定,

2自動インクリメント,bit3は1TEST0ノーマルです。

​ 出力は0x40,入力は0x42となります。

 ディスプレイレジスタアドレス 

TM1638データシートより抜粋

 B0が0のアドレスは7segのLEDです。1のアドレスは単独のLEDで,データ0x01でON 0x00でOFFです。

​ 7segLEDの先頭アドレスは0xc0です。

 スケッチ例 

a0000_test_010_3command_16data_1command

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

​33

​34

//宣言部
#define stb 10//STB_pin
#define clk 9//CLK_pin
#define dio 8//DIO_pin

//初期設定部
void setup(){
  pinMode(stb,OUTPUT);//stb_pin初期化
  pinMode(clk,OUTPUT);//clk_pin初期化
  pinMode(dio,OUTPUT);//dio_pin初期化

 

 digitalWrite(stb,LOW);//stb_pin をLOWに 送受信可
  shiftOut(dio,clk,LSBFIRST,0x88);//display mode
  digitalWrite(stb,HIGH);//区切り
  digitalWrite(stb,LOW);//stb_pin をLOWに 送受信可
  shiftOut(dio,clk,LSBFIRST,0x40);//data instruction
  digitalWrite(stb,HIGH);//区切り
  digitalWrite(stb,LOW);//stb_pin をLOWに 送受信可
  shiftOut(dio,clk,LSBFIRST,0xc0);//display address
  for(int i=0;i<16;i++){
    shiftOut(dio,clk,LSBFIRST,0xff);//7segLED データ
    shiftOut(dio,clk,LSBFIRST,0x01);//単LRD データ
  }
  digitalWrite(stb,HIGH);//区切り
  digitalWrite(stb,LOW);//stb_pin をLOWに 送受信可
  shiftOut(dio,clk,LSBFIRST,0x88);//display control
  digitalWrite(stb,HIGH);//stb_pin をHIGHに 送受信終了
}

//繰り返し部
void loop(){
}

//関数・補助部

 command1 ディスプレイモード

 command2 データ モード

​ command3 レジスタアドレス

 16bytesのデータ

​ command4 ディスプレイコントロール

 3つのコマンドと16のデータ,最後にディスプレイコントロールのコマンドの組み合わせのスケッチです。

​ 16のデータは7segと単独LEDを分けて2バイトを1組にしています(21,22行目)。20行目と23行目を取って19行目を0xc0から0xcfまで指定すると1つのLEDを操作することができます。

 MAX7219 

 入手したてでデータなし。

 液晶表示器 

 Arduinoで16桁×2行の液晶1602の使い方です。

 1602A 

​2017年1月14日

 LCDは種類がたくさんありますが電圧変換なしで使いたいので1602Aを選択しました。

 ピンヘッダをブレッドボードに固定してハンダ付けすると,真っ直ぐに仕上げられます。

 データシートを見てみると不思議な配線です。

 1602Aデータシートより

 意味はわかるのですが,×のところはつないではいけないと思います。

 1602Aデータシートより

 こうなるべきだと思います。

 バックライト 

アンカー 2

 LEDは抵抗を直列に入れるものと思っていますので,200Ωの抵抗を入れてみましたが,どうも輝度が低いように思われます。

 よって,こちらは回路図通りに抵抗なしで結線してみました。

 輝度も良くなりました(LEDが焼けてしまうのではないかと,少し怖い思いをしました)。

​ 次はVO(液晶のコントラスト)です。これは20KΩのVR(可変抵抗)でコントロールするようになっています。

 LCDの表示 

​2017年1月15日

 液晶表示器に文字等を表示させるにはデータを送らなくてはいけません。

 データは表示するだけなので液晶は読むだけです。よって,R/WはGNDに接続して読み込み専用とします。

​ VSS,VDDはGNDと5Vです。V0はコントラストですので20KΩのVRで中間点を接続します。

 データを書き込む 

 RSとEにパルスを送りD4~D7にデータを送ると液晶に書きこむことができます。

 Arduinoとの配線 

 Arduinoで液晶を使うために上の図のように配線します。

 ライブラリを使ったスケッチ 

LCD01

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

/*
説明部分
*/

//宣言部分
#include <LiquidCrystal.h>//インクルード ファイルはArduino内臓

//LCD具現化
//RS,EnableとD4,6,D10~D13をArduinoとつなぎます。
LiquidCrystal lcd(4,6,10,11,12,13);

 

void setup() {//初期設定部分
  //16文字2行のLCDを使う設定です。
  lcd.begin(16, 2);
  //LCDへの文字出力です。
  lcd.print("hello, world!");
}

 

void loop() {//繰り返し部分
  //カーソルの移動です。
  lcd.setCursor(0, 1);
  //0文字目,1行目(0から数えます)です。

 

  //変数の表示です。
  lcd.print(millis() / 1000);
  //millis()はmsを求める関数です。
  //1000で割っているので1秒です。
}
 //関数・補助部分

 スケッチの解説 

 スケッチ例のLiquidCristal​の中の"HellowWorld"を読み込みます。

 6行目の#include  <LiquidCrystal.h>はLCDのライブラリを使うという宣言です。

 10行目の LiquidCrystal lcd(4, 6, 10, 11, 12, 13);
    の数字をRS,E,D4,D5,D6,D7に接続したPIN番号です。

 14行目の LCD.begin(16,2);

  は16文字2行のLCDを使用するという意味です。

 16行目の LCD.print("XXXX");

  はXXXXを表示するという命令です。

  ""で囲まれている場合はその文字を表示します。

 21行目の LCD.setCursor(0.1);

  は表示位置の先頭をx,yの座標で表しています。

  座標は0から数えます。

 

 25行目の LCD.print(millis()/1000);

  millis() はRESET後のミリ秒数です。

  を1000で割るので1秒毎のことです。

  経過時間(秒)を表示します。

 ライブラリを宣言することで他にもいくつかLCDに関係する命令が使えるようになります。

 コンパイル書き込みして実行します。

​ V0をアースに接続した場合のLCDです。

 液晶表示 

 ライブラリを使うと簡単にスケッチが描けます。

 コントラスト調整 

 データシートの回路でVRを付け加えるとコントラストも調節できました。1回設定すれば後は操作をあまり必要としません。

 LCD Keypad Shield 

 ブレッドボードは接触不良が多いので注意が必要です。電極を良く磨きましょう。

 電極を磨かなくても済む,Arduinoにはシールドという考えが有ります。液晶を探しみました。写真のようなシールドが見つかりました。ほぼ理想的な形だと思います。Amazonで調べてみると値段も500円少しと手ごろでしたが,よく探すとともっと安いものもありました。どのような違いが有るのでしょうか。

 PIN接続は(8,9,4,5,6,7);のようです。

​ 到着はしばらく後です。

 表示の練習 

 表示の練習をしておきます。

  この表示機ではカタカナは直接使えません。

 

 lcd.print("コンニチハ ミナサン");と入力すると

 

 oスコoセ oセ oセ oセ

 

 に似た表示になります。

 lcd.print("\xba\xdd\xc6\xc1\xca \xd0\xc5\xbb\xdd");

 と入力します。

 コンニチハ ミナサン

​ と表示します。

"Specification for LCD Module 1602A-1"に命令コードやキャラクタコードが記載されています。

 練習のスケッチ 

LCD_表示02

#include <LiquidCrystal.h>//宣言部分

LiquidCrystal lcd(4, 6, 10, 11, 12, 13);

int temperature=18;
 

void setup() {//初期設定部分
  lcd.begin(16, 2);
}

void loop() {//繰り返し部分
  lcd.setCursor(0, 1);//液晶のカーソル移動

​//液晶表示

 lcd.print("\xb7\xb5\xdd ");//キオン

 lcd.print(temperature);//18
  lcd.print("\xdf");//°
}

​//関数・補助部分
 

 キャラクタコード表 

 1602Aのキャラクターコードです。文字は少し形が違います。詳細はデータシートをご覧ください。

"Specification for LCD Module 1602A-1"に命令コードやキャラクタコードが記載されています。

 LCDライブラリのコマンド一覧 

  LiquidCristal()

  begin()

  clear()

  home()

  setCursor()

  write()

  print()

  cursor()

  blink()

  noBlink()

  display()

  noDisplay()

  scrollDisplayLeft()

  scrollDisplayRight()

  autoscroll()

  noAutscroll()

  leftToRight()

  rightToLeft()

  createChar()  

生成

初期化

すべて消去

カーソルホーム

カーソル移動

表示BYTE

表示キャラクタ

点滅

点滅なし

表示する

表示しない

 モータ 

 モータドライバシールド 

2017/6/9

 モータドライバシールドを手に入れました。ステッパもDCモータもコントロールできるそうです。

配線

 2日目

2016年8月13日(土)

 サーボモータを自在に操ることを目標に作業を続けます。

 ​パルスの幅によりサーボモータの角度が変わります。

 Arduinoのコンパイラを起動します。

void setup()
{
 // put your setup code
​ //ここに初期化のプログラムを書きます。


void loop() {
// put your main code here, to run repeatedly:
 //ここは主になるプログラムを書きます。
 //永遠に繰り返します。 
}

 Arduinoをパソコンにつなぐと接続音がします。(しない場合は何かの不具合です)。
 ディバイスマネージャーを開いて右のようにポートの項目を広げると

Arduino Uno(COM7)
のようにコムポートの番号がわかります。
 Arduinoコンパイラの窓の上の方にあるツールでポートがArduinoの番号になっていることを確かめます。

 基本的プログラム 

基本プログラム

void setup() {

 pinMode(3,OUTPUT);//出力PINを3番PINにします。

int a=500;//定数 サーボの最短パルス時間μSです。

int pos=0;//変数 カーボのホーン(角(つの))の角度です。

void loop() {

 pos=90;

 digitalWrite(3,HIGH);//PIN3をHIGHにします。

   delayMicroseconds(pos*10+a);//パルス出力時間です。

 digitalWrite(3,LOW);//PIN3をLOWにします。

 delayMicroseconds(20000-(pos*10+a));

delay(1000);//1秒待ちます。

​}

 POSに数字を入れるとその角度まで回転します。

 最後の行を入れないと1秒間に50回この角度にする命令が送られてしまうので,モータが熱くなってしまいます。危なくモータを焼いてしまうところでした。

 ライブラリを使う 

  Arduinoのスケッチにはディバイス容易にを使うためにライブラリが用意されています。プログラムが簡単に作れます。

#include <Servo.h>//ライブラリを読み込みます。

Servo myservo;//Servo型の道具を作ります。

int p=90; //定数の定義

int pos=0;//変数の定義

void setup() {

  myservo.attach(3,630,2400);

   //PIN番号,0°のパルス幅,180°のパルス幅(μs)

void loop() {

pos=-90;//ここに角度を入力します。

 myservo.write(pos+p);//これが命令

 delay(50);//待ち時間

​}

 初めてサーボモータを使って一週間(実働2日),これなら実際に使えると思います。難しいと思うのは知らないからでした。
 使えるようになってもその後が続かないといけません。皆さんのHPを見ていると,すぐに実用的なものを作っているのが素晴らしいと思います。私も何か役に立つものを作りたいものです。

​ 操作不能 

操作不能

2016年8月14日(日)

#include <Servo.h>//ライブラリを読み込みます。

Servo myservo;//Servo型の道具を作ります。

int p=90;  //定数の定義

int pos=0;//変数の定義

int in1;    //変数の定義

void setup() {

  Serial.begin(9600);//シリアル通信の設定

  myservo.attach(3,630,2400);

   //PIN番号,0°のパルス幅,180°のパルス幅(μs)

void loop() {

pos=-90;//ここに角度を入力します。

 in1 = Serial.read();

 if(in1=='a'){pos=180;}

​ Serial.print(in1);

 myservo.write(pos+p);//これが命令

 delay(50);//待ち時間

​}

​ サーボを制御する時にROMを書き換えるのは効率的ではありません。232C通信でパソコンから指示しようとしました。
 色の付いたところを付け加えるだけでUSBを通してシリアル通信で命令を送ることができます。
​ 最後の行を付けたしてフィードバックがパソコンで確認できて喜んでいたのですが,USBコードを外して作業していたところ,コンパイラともコンソールともつながらなくなってしまいました。

復帰

​ 復帰しました 

2016年8月15日(月)

 Tera Term「寺西 高(てらにし たかし)さん作」を使わせていただいています。接続してそのままUSBコードを抜いてしまったので,コンパイラに接続できなかったのです。焦っていたので,もう一度Tere Termに接続しようとしたので,これもつながらなかったのです(すでにつながっています)。
 接続を切ったと思ったのは,物理的に線を外しただけでした。Tera Termのコマンドで接続断をクリックすると,コンパイラの介入を受け付けてくれました。安心しました。
 それにしても,良かった。一時はブートローダーの書き換えを考えていました(それはそれで勉強になるのですが)。元に戻ってよかったと思います。

​ SG90キーボードから操作 

キーボードから操作

2016年8月15日(月)

 キーボードからサーボモータSG90を操作できるようにします。
 ”a” のキーを押すとサーボは0°の位置に移動,同時にモニタ画面のコンソール窓に97というキーコードが表示されます。(表示が思っているものと違うのですが・・・・

  キーボードで ”s” を押すと90°の位置に arm が回転します。回転速度は十分実用になる早さだと思います。

  ”d” のキーを押すと,サーボのアームは180°の位置に回転します。"a" と ”d” は同じように見えますが,写真からはアームの回転の慣性でサーボが反時計回りに移動しているのがわかります。

 プログラムです 

#include <Servo.h>//ライブラリを読み込みます。

Servo myservo;//Servo型の道具を作ります。

int pos=0;//変数の定義

//初期設定

void setup() {

  Serial.begin(9600);//シリアル通信の設定

  myservo.attach(3,630,2400);

​         //PIN番号,0°,180°の(μs)

//繰り返しの動作

void loop() {

 int in1 = Serial.read();シリアル入力の変数定義

 if(in1=='a'){pos=0;}
if(in1=='s'){pos=90;}
if(in1=='d'){pos=180;}
if(in1>-1){Serial.print(in1);Serial.write("\n");}

 myservo.write(pos+p);//サーボ動作(命令)

 delay(100);//待ち時間

​}

 なかなか快適にサーボが動きます。ほぼリアルタイムです。

 残念なのは,コンソール出力が斜めになってしまうことです。

 サーボモータ用のモジュール

サーボドライバモジュール

2017/6/9

 I2Cのサーボモータドライバモジュールを手に入れました。

 S4Aスクラッチ 

スクラッチで操作

 スクラッチではこれだけでサーボを動かすことができます。

カメラマウント

2017年9月12日(火)

 サーボを使ってカメラマウントを動かす事ができます。2軸 カメラマウントを購入してみました。

​ 工作が面倒だと不評な面もありますが,安価で有る程度動かすことができるので,いいものだと思います。

 底部とサイド部2とマウント部と4つの部品で構成されています。ビス大6,ボルト大6,ボルト小8,ナット8,ビス小8とネジ類が多く入っていてうれしい。(120円2017_12_9)

​ 底部の部品取り付け 

 ホーンの加工 

 底部の部品にサーボのホーンを組み込むのですがホーンの形が合いません。

 ホーンの両端をニッパで切って,太い部分をやすりで削ります。形状が整ったら底部部品にビス付けします。

 底部部品にホーンをはめ込む時左の方向だと2本しか止められません。もともと短い方のホーンは2孔しかありません。縦横でビスの位置は異なります。方向を選ぶとビスが4本止められます。2本では心細かったのですが,今回気が付き4本のビス止めができました。

 2017年12月28日加筆

 側部の工作 

 中央部の回転部分はサーボを両側から挟んでつばを溝にはめ込みます。きっちりしているので入れにくい構造ですが,ぴったりとはいります。サーボをはさむ部分は少々大きく,隙間が開いてしまいます。同じ広さで左右をあけるようにします。

​ サーボの取り付け方向は好みによるかもしれません。

 仰角サーボ用ホーンの加工 

 仰角部分用のホーンも切断します。こちらは太さの変更は必要ありません。長さを整えたら角を削ってはめ込みます。

​ 小ビスで止められますがボルトを使うと危険が減ります。大ビスで取り付け孔を拡大してボルトで止めます。

 ネジとサーボとの間が狭いので内側からボルトを通します。ナットだと,つかえてしまいます。

​ 側部部品を合わせる前にホーンを固定します。

 仰角サーボの固定 

 カメラマウント部仰角用サーボ取り付けには大ビスでしっかり止まりますが,ビス先がとがっているのでボルトとナットにします。

​ カメラマウント部分の裏側のサーボ固定用孔を大ビスで拡大します。

 大ボルトとナットで固定します。サーボのリードを傷付けてしまいそうなのでボルトをニッパで切断します。

 反対側はじゃまにならないのでそのままにします。

 底部と側部の組み立て 

 中央の回転部を底部に取り付けます。サーボホーンを装着しないと付けられません。

 側部の2つの部品にサーボをはさみます。サーボより少し大きめの感覚なので隙間ができます。

​ 隙間が同じ感覚になるよう組み立てます。サーボの向きに気を付けましょう。バランスが異なります。大ビス2本で固定します。

 中央の回転部を底部に取り付けます。サーボホーンを装着しないと付けられません。

 側面部品とマウント部の結合 

 マウント部を回転部に取り付けます。きつくてプラスチックが折れてしまいそうで心配でした。

​ サーボを組み込んだマウントをホーンにサーボを差し込みます。反対側の支えに穴の部分をはめ込みます。

 カメラマウント応用 

 カメラマウントが完成しました。

​ 形状からすると関節のようにも使えそうです。

​ アーテックのブロックを接着してみました。これで,色々な実験ができそうです。

ステッピングモータ

 ステッピングモータ 

2016年8月18日(木)

​ リレー 

 スイッチを電気の力でON,OFFする装置です。

​ SRD-05VDC-SL-C 

 5Vで動作するリレーです。

 中央の直方体がリレーです。回路は単純ですが多くの電流を扱うので大きなディバイスになっています。

 電磁石で電極をひきつけスイッチを切り替えます。原理を示す図です。

 実験回路 

​ 3本のメスオスのジャンパ線を用意します。

 VCCとGNDをそれぞれつなぎ信号線はDpin2とします。

​ リレーのスケッチ 

relay01

   1

   2

   3

   4

   5

   6

   7

   8

   9

  10

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

void loop() {
  digitalWrite(2,1);
  delay(1000);
  digitalWrite(2,0);
  delay(1000);
}

 setup()では出力用のpin2を出力に設定します。

​ 繰り返しの中では1秒ごとにリレーをon,offします。リレー特有のカチカチという音が聞こえます。

 見えにくいのですがリレーの右後ろに入力用のLEDが有ります。点滅して同時にチカチカと接点が音を立てます。

 リレーを動かすのには電力がいります。テスタで見てみると3.4mA程です。

 Arduinoの消費電流は30mA位ですがリレーを動作させている間は90mAになります。

​もったいない電流です。

 もったいない。

bottom of page