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

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

あまりの懐かしさに、ちょっと感動しました。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 からの時刻をコンパイル時に定数に渡してそれをセットしている感じですので、転送完了までタイムラグがあり、正確にセットするには工夫が必要だとわかりました。