なつかしのテニスゲーム!

これ、幼稚園くらいにやったような記憶があります。

あまりの懐かしさに、ちょっと感動しました。120 x 60ピクセルでのゲームも原点に返っていいかもです。

pong

まだ操作パッドは作っていないんですが、arduino 単体でVGA に表示してテニスゲームが出来るなんて想像すらしませんでした。

pong1

ソースコードは、ここに作者がアップロードしています。

[youtube https://www.youtube.com/watch?v=mrRGosn48gw]

操作するパッドを作って遊びたいですね。

ArduinoNano 単体で VGA出力

時計をどっかに出力したいけども、手元に出力するものがないので、なんか良い方法はないかなぁと調査していたところ、なんと、Arduino 単体でVGA 出力できるそうではないですか!以下、横スクロールしている写真です。

2

抵抗が5本とジャンク品のマザーボードからぶっこぬいてきた、VGAメスに配線し、VGA 出力できました。

写真 2

配線するだけで、良いとはまさに盲点。

写真 1

全体像はこんな感じ。

1

まだ時計のデータは表示していませんが、このVGA出力で、RTC の情報なんかを表示してみようと思っています。

 

使用したライブラリは、VGAX Library for Arduino UNO です。イタリアのMaffiodo, Sandroさんが作られたものです。リンク先行くと、画像のようなピクセル表示の絵なんかも出せます。このVGA 出力の表示方法を考えたのは、今から3年前にオーストラリアのNick Gammon さんがフォーラムでリリースしたのが最初のようです。

 

面白いのは、RGB 信号を抵抗で降圧させて、あとは垂直・水平同期信号を出して、GND入れて6本の配線でVGA コネクタへつながります。このあたりの評価を解析したまじめなサイト(Arduinoを用いたVGA映像信号の出力・穴田 拓磨さん)もあり、勉強になりました。トランジスタと抵抗4本とコンデンサを使ったエミッタフォロワ回路の紹介もあり、波形は断然綺麗でした。

 

今や、HDMI や DVI が主流のビデオ出力信号ですが、アナログRGB のVGA も用途によっては活躍する場がありますので、覚えておいて損はないですね。

Tiny RTC DS1307 I2C その2

暑くて、夏到来ですね。8月に入って、また今年も暑い夏がやってきました!

昼間はとても、PC触る気にならないので自然と夜型になります。昼は友達とお茶して、構想を練っていました。

 

さて、RTC を半田付けして配線してソフトウェアをコピペして動かしてみました。

ProMini につけてみました。配線は4本で、2本は電力、2本がデータ通信です。ProMini のA4(SDA) と A5(SCL) がどこにあるのかわからず、ピンをつける前のを見て判明。

promini

とりあえず、こんな感じでPC にシリアル経由でデータを流してみました。

2

シリアル通信に、時が流れて、電源を切って再接続しても、当然ながら時が刻まれています。

1

プログラムソースは以下な感じです。

/*
 Tiny RTC (DS1307) Sample.
 RTClib.h
  --> https://github.com/jcw/rtclib

 JunkHack 2015.07.31(Fri)
 */

#include <Wire.h>    // Wire lib.
#include "RTClib.h"  // need to install the RTClib by jcw

RTC_DS1307 RTC;      // RTC Modul

void setup(void) {

  Wire.begin(); // Initialisiere I2C
  RTC.begin(); // Initialisiere RTC
  Serial.begin(9600);

  // Set SQW/Out signal frequency to 1 Hz.
  RTC.setSqwOutSignal(RTC_DS1307::Frequency_1Hz);

  // Serial mes.
  Serial.print(__DATE__ " " __TIME__); // コンパイルしたときの日時 Aug  1 2015 13:24:48
  Serial.println(" : Tiny RTC DS1307 I2C --- test");

  // RTC にクロックがセットされているか?
  if (! RTC.isrunning()) {

    // コンパイル時の、現在の日付と時刻を設定
    RTC.adjust(DateTime(__DATE__, __TIME__));          // IDE の PC 時刻
    Serial.println("Current time to the RTC");
  }
  else Serial.println("RTCは、すでに実行されています。");
}

void loop(){
  DateTime now=RTC.now(); // Current time geting from RTC
  show_time_and_date(now);  // Print Serial
  delay(1000); // 1 Sec
}

// set week
String get_day_of_week(uint8_t dow){

  String dows="  ";
  switch(dow){
   case 0: dows="Sun"; break;
   case 1: dows="Mon"; break;
   case 2: dows="Tue"; break;
   case 3: dows="Wed"; break;
   case 4: dows="Thu"; break;
   case 5: dows="Fri"; break;
   case 6: dows="Sat"; break;
  }

  return dows;
}

// print date time. ex 2015.07.31(Fri) 23:22:31
void show_time_and_date(DateTime datetime){
  // 2015.07.31(Fri) 
  Serial.print(datetime.year(),DEC);
  Serial.print(".");
  if(datetime.month()<10)Serial.print(0);
  Serial.print(datetime.month(),DEC);
  Serial.print(".");
  if(datetime.day()<10)Serial.print(0);
  Serial.print(datetime.day(),DEC);
  Serial.print("(");
  Serial.print(get_day_of_week(datetime.dayOfWeek()));
  Serial.print(") ");

  // Time 23:22:31
  if(datetime.hour()<10)Serial.print(0);
  Serial.print(datetime.hour(),DEC);
  Serial.print(":");
  if(datetime.minute()<10)Serial.print(0);
  Serial.print(datetime.minute(),DEC);
  Serial.print(":");
  if(datetime.second()<10)Serial.print(0);
  Serial.println(datetime.second(),DEC);
}

実際に動かしてみると、なるほどーという感じで実感が沸きます。時刻はIDE の PC からの時刻をコンパイル時に定数に渡してそれをセットしている感じですので、転送完了までタイムラグがあり、正確にセットするには工夫が必要だとわかりました。

Arduino と RasPi2 と ESP8266

ここのところ、遊び道具が増えてきて、あれもやりたいこれもありたいと調査していると、結局何も手付かずに終わってしまう不毛な毎日が続いているので、とりあえず、やってみたいことを整理してみます。

 

・ESP8266 の省電力化と、リチウム電池利用した温度湿度照度の単体デバイスの作りこみ

単体ではそこそこ調査は終わっていて、あとは作りこみ。ESP8266(ESP12) + DHT-22(AM2302) + GL5528でセンサー部と、データをWiFi で投げてThingSpeak に投げることまでは完了。残るは、省電力化へのコードの検討、テストと、バッテリー駆動への電力部の作成(というか、パーツ組み合わせるだけ)です。途中で、RasPi2 をゲットしてそっちに気がほうけてしまい手付かずの案件。

2015_05_10_2_14

+

HTB19pQDHXXXXXXyXFXXq6xXFXXX7

+

HTB1NkOvHFXXXXa_aXXXq6xXFXXXt

 

 

・ProMini を活用したモータ制御するロボット(プログラム制御の車とか、リモコン制御のものとか)

極小のギヤモータは、ゲット済みでモータードライバなしでarduino に直結して動作させる予定の案件。基本部分が出来ればあとはセンサー拡張して楽しむ予定の案件

 837293198_862

+gearmoter

・HC-06(Bluetooth) + ProMini で HID USBデバイス

SPPのやつなんですが、HID にできるかもしれないので、一応ゲットしました。だめなら、ちょっと高価なHM-10でやるつもりのもの。まだ、未調査なので、動作確認もしてない放置もの。

a

or

b

・RasPi2(母艦) + Firmata化したarduino との通信

これはつい最近、知ったんですがFirmata という汎用通信規格がやり取りできるよう arduino にスケッチを入れてコントロールはシリアル経由でやるという代物。ソフトウェア実装なので、電子工作が伴う前の基礎技術の研究をしたいなと。コントロールする母艦は、RasPi2 でやるつもりで、実装方法はいろいろあるようです。Python や Ruby や C 、PHP、そしてnode.js とかでも出来るようです。表示やコントロールが伴うものは、HDMI出力があるRasPai からやったほうが良さそうなので、そいういう用途にGUI でラップしたFirmata のアプリケーションを作れないかなと。こちらは、まだ未調査なので、どんな組み合わせがベストなのかは不明。

 

 

このほかにもあれこれと、やりたいことが調べているうちに出てきてしまうんですが、上4つはやりたいですね。今年度中はおそらくこれらで、あそべるはず。特に、ソフトウェア的な組み合わせが出来る、RasPai との連携を考えると、技術が追いつかなさそうなので、ぼちぼと勉強しながらやっていきたいと思っています。

 

さて、とりあえず何からやりますかね。気がノルやつから手をつけていきますか。遊びでは、それが基本スタンスですからね。

Pi2 と arduino をUSB接続してシリアル通信

今日は、Pi2 と arduino をシリアル通信させてLED を光らせてみました。全体像はこんな感じ。

写真 1

緑色のブレッドボードにある LED は arduino の 3pin につながっています。Pi2 からシリアル経由でLED を光らせる形です。

写真 2

良いチュートリアルなBlog 記事があったので、それを習ってみました。

参考 Raspberry PiとArduino間でUSB経由のシリアル通信

 

まず、arduino のスケッチは、上記サイトにあるとおり、

#define LED_PIN (3)
byte val;

void setup(){
  // Serial Setting
  Serial.begin(9600);

  // Port Setting
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
}

void loop(){
  if(Serial.available() > 0){
    
    val = Serial.read();
    Serial.write(val);
    if(val == 'A'){
      digitalWrite(LED_PIN, HIGH);
    }

    if(val == 'B'){
      digitalWrite(LED_PIN, LOW);
    }
  }
}

そして、書き込んで、今度は pi2 からシリアル通信させます。

USB ケーブルを挿すと、pi2 側の dmesg に以下のように出ますので、覚えておきます。

[root@pi2 ~]# dmesg

::

[ 4270.245917] usb 1-1.5: new full-speed USB device number 5 using dwc_otg

[ 4270.369007] usb 1-1.5: New USB device found, idVendor=1a86, idProduct=7523

[ 4270.376106] usb 1-1.5: New USB device strings: Mfr=0, Product=2, SerialNumber=0

[ 4270.383583] usb 1-1.5: Product: USB2.0-Serial

[ 4271.484705] usbcore: registered new interface driver usbserial

[ 4271.491107] usbcore: registered new interface driver usbserial_generic

[ 4271.499466] usbserial: USB Serial support registered for generic

[ 4271.508688] usbcore: registered new interface driver ch341

[ 4271.514472] usbserial: USB Serial support registered for ch341-uart

[ 4271.521035] ch341 1-1.5:1.0: ch341-uart converter detected

[ 4271.531056] usb 1-1.5: ch341-uart converter now attached to ttyUSB0★

[root@pi2 ~]#

[root@pi2 ~]# ll /dev/ttyUSB0

crw-rw—- 1 root dialout 188, 0  7月  6 23:08 /dev/ttyUSB0★

[root@pi2 ~]#

pi2 からシリアル通信させるプログラムは、minicom というのを使ってみました。

[root@pi2 work]# which minicom

/usr/bin/minicom

設定は、以下のように –s をつけて起動。

▼設定

[root@pi2 work]# LANG=C minicom –s

以下のように cui で選択して設定します。

            ┌─────[configuration]──────┐
            │ Filenames and paths      │
            │ File transfer protocols  │
            │ Serial port setup        │
            │ Modem and dialing        │
            │ Screen and keyboard      │
            │ Save setup as dfl        │
            │ Save setup as..          │
            │ Exit                     │
            │ Exit from Minicom        │
            └──────────────────────────┘

    ┌───────────────────────────────────────────────────────────────────────┐
    │ A -    Serial Device      : /dev/ttyUSB0                              │
    │                                                                       │
    │ C -   Callin Program      :                                           │
    │ D -  Callout Program      :                                           │
    │ E -    Bps/Par/Bits       : 9600 8N1                                  │
    │ F - Hardware Flow Control : Yes                                       │
    │ G - Software Flow Control : No                                        │
    │                                                                       │
    │    Change which setting?                                              │
    └───────────────────────────────────────────────────────────────────────┘

    ┌─────────────────┌─────────[Comm Parameters]──────────┐────────────────┐
    │ A -    Serial De│                                    │                │
    │                 │     Current:  9600 8N1             │                │
    │ C -   Callin Pro│ Speed            Parity      Data  │                │
    │ D -  Callout Pro│ A: <next>        L: None     S: 5  │                │
    │ E -    Bps/Par/B│ B: <prev>        M: Even     T: 6  │                │
    │ F - Hardware Flo│ C:   9600        N: Odd      U: 7  │                │
    │ G - Software Flo│ D:  38400        O: Mark     V: 8  │                │
    │                 │ E: 115200        P: Space          │                │
    │    Change which │                                    │                │
    └─────────────────│ Stopbits                           │────────────────┘
            │ Screen a│ W: 1             Q: 8-N-1          │
            │ Save set│ X: 2             R: 7-E-1          │
            │ Save set│                                    │
            │ Exit    │                                    │
            │ Exit fro│ Choice, or <Enter> to exit?        │
            └─────────└────────────────────────────────────┘

で、実行。

[root@pi2 work]# LANG=C minicom

Welcome to minicom 2.7

OPTIONS: I18n 
Compiled on Aug 17 2014, 17:46:22.
Port /dev/ttyUSB0, 23:40:40

Press CTRL-A Z for help on special keys

AABABABABABAAABAB★こんな感じで、タイプするとLED ついたり消えたり。

終了は、CTL + A 押して、Z でメニュー 以下の Q で終了

┌───────────────────────────────────────────────────────────────────┐
│                      Minicom Command Summary                      │
│                                                                   │
│              Commands can be called by CTRL-A <key>               │
│                                                                   │
│               Main Functions                  Other Functions     │
│                                                                   │
│ Dialing directory..D  run script (Go)....G | Clear Screen.......C │
│ Send files.........S  Receive files......R | cOnfigure Minicom..O │
│ comm Parameters....P  Add linefeed.......A | Suspend minicom....J │
│ Capture on/off.....L  Hangup.............H | eXit and reset.....X │
│ send break.........F  initialize Modem...M | Quit with no reset.Q │
│ Terminal settings..T  run Kermit.........K | Cursor key mode....I │
│ lineWrap on/off....W  local Echo on/off..E | Help screen........Z │
│ Paste file.........Y  Timestamp toggle...N | scroll Back........B │
│ Add Carriage Ret...U                                              │
│                                                                   │
│             Select function or press Enter for none.              │
└───────────────────────────────────────────────────────────────────┘

 

今度は、python から制御。 pyserial を入れます。

[root@pi2 ~]# dnf install python-pip

[root@pi2 ~]# pip install --upgrade pip
You are using pip version 6.0.8, however version 7.1.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting pip from https://pypi.python.org/packages/py2.py3/p/pip/pip-7.1.0-py2.py3-none-any.whl#md5=b108384a762825ec20345bb9b5b7209f
  Downloading pip-7.1.0-py2.py3-none-any.whl (1.1MB)
    100% |################################| 1.1MB 37kB/s 
Installing collected packages: pip
  Found existing installation: pip 6.0.8
    Uninstalling pip-6.0.8:
      Successfully uninstalled pip-6.0.8

Successfully installed pip-7.1.0
[root@pi2 ~]# 

[root@pi2 ~]# pip install pyserial
::
Successfully installed pyserial-2.7
[root@pi2 ~]# 

プログラムは、以下のようにA と B をループして、CTL + C で中断したら、B を流しLEDを消して、終了。

---- loop.py 
# -*- coding: utf-8 -*-
import serial
import time

ser = serial.Serial('/dev/ttyUSB0', 9600)
time.sleep(2)
try:
    while True:
        ser.write('A')
        time.sleep(1)
        ser.write('B')
        time.sleep(1)
except KeyboardInterrupt:
        ser.write('B')
        ser.close()

実行してみます。

[root@pi2 work]# python loop.py

なるほどですね。まぁ、これだと、pi2 の GPIO ピンから直接制御すればええやんってことになりますが、、、次は、arudino のアナログ入力にセンサーをつけて、それをpi2 に渡す方法を実践してみたいと思います。I2C とかシリアルを使わない結線だと、promini とかが使えるので、そういうのをどのようにするのか調査して、実践してみたいと思っています。

AM2302温度湿度センサーをArduino Nanoでテスト

温度と湿度のセンサーが合体したので、単線で使えるものを探していたら、DHTシリーズというのがあったので、これをテスト。

メーカーは、Aosong Guangzhou Electronics Co., Ltd.で、中国の広州にあるセンサー専門メーカーのようです。1個2.99 ドルで、Nanoよりも高いです。そこそこ、精度は取れるのでしょうかね。

 

DHT22_AM2302_fzz

手持ちに10KΩが見当たらなかったので、5.6K を2つ付けています。センサーからは4Pin 出ていますが、使うのは3本です。

AM2302

 

https://www.sparkfun.com/datasheets/Sensors/Temperature/DHT22.pdf

3. Technical Specification:
Model DHT22
Power supply 3.3-6V DC
Output signal digital signal via single-bus
Sensing element Polymer capacitor
Operating range humidity 0-100%RH; temperature -40~80Celsius
Accuracy humidity +-2%RH(Max +-5%RH); temperature <+-0.5Celsius
Resolution or sensitivity humidity 0.1%RH; temperature 0.1Celsius
Repeatability humidity +-1%RH; temperature +-0.2Celsius
Humidity hysteresis +-0.3%RH
Long-term Stability +-0.5%RH/year
Sensing period Average: 2s
Interchangeability fully interchangeable
Dimensions small size 14185.5mm; big size 22285mm

 

datasheets_Sensors_Temperature_DHT22_pdf

コートは、サンプルのです。華氏でシリアルプリントしている部分はいらないので、以下のようにしました。

ライブラリは、以下を使いました。

— Arduino library for DHT11DHT22 —
https://github.com/adafruit/DHT-sensor-library

 

/*
AM2302 DHT22 humidity/temperature sensors
Read test.

--- AM2302 Aosong Guangzhou Electronics Co., Ltd. --- 3 to 5V power and I/O 2.5mA max current use during conversion (while requesting data) Good for 0-100% humidity readings with 2-5% accuracy Good for -40 to 125°C temperature readings ±0.5°C accuracy No more than 0.5 Hz sampling rate (once every 2 seconds) Body size 15.1mm x 25mm x 7.7mm 4 pins with 0.1" spacing

--- Arduino library for DHT11DHT22 --- https://github.com/adafruit/DHT-sensor-library

JunkHack 2015.06.14 */

include "DHT.h"

define DHTPIN 2 // what pin we're connected to

// Uncomment whatever type you're using! //#define DHTTYPE DHT11 // DHT 11

define DHTTYPE DHT22 // DHT 22 (AM2302)

//#define DHTTYPE DHT21 // DHT 21 (AM2301)

// Initialize DHT sensor for normal 16mhz Arduino DHT dht(DHTPIN, DHTTYPE);

void setup() { Serial.begin(9600); Serial.println("DHT22 AM2302 test!");

dht.begin(); }

void loop() { // Wait a few seconds between measurements. delay(2000);

// Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius float t = dht.readTemperature(); // Read temperature as Fahrenheit float f = dht.readTemperature(true);

// Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; }

// Compute heat index // Must send in temp in Fahrenheit! float hi = dht.computeHeatIndex(f, h);

Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.println(" *C "); }

梅雨時なので、湿度が高いかしらね。温度は、常夏の気温ですが。暑すぎない?

まぁ、こんな感じで湿度と、温度がとられていますね。