arduino UnoやJapanino、ESP-WROOM-02 の電圧・電流について (10/31)
arduino UnoやJapanino、ESP-WROOM-02 の電源容量 (11/4)で内容の修正があります。
ESP-WROOM-02につなぐ事を考えると、「電源電圧」というのが3.3Vらしいがこれは何なのかよくわかっていない。USBもそう。
電源電圧・・・そのマイコンに電源とされる電気の電圧。arduino Unoは5Vで、JapaninoやESP-WROOM-02は3.3V。DC5Vと書かれていたりするので直流の5Vだから、電池でも可能。ただし電圧が下がると動作が不安定になるので沢山電流を必要とするマイコンや回路の場合、電池ではつらいものがある。Unoはマイコンだけで8mA、1つのI/Oピンに40mA程度流せるので、沢山のI/Oピンから電流を流すとトータルで電池はあっという間に消耗していく。でも700mAとか流せるので、電圧が最後まで余り下がらないエコループ乾電池などなら最後まで安定して使える。ESP-WROOM-02はシリアルポートを使うとき、170mA以上使うのでUSBならUSBだと5V50mAくらいなので、アウト。じゃあ電池ならOKかな。
端子の入出力電圧・・・入力はAD変換が出来る端子なら10bitは5Vまで入力できるので、0~5Vまで入力できる。デジタル入力でも0はLow、5VはHiだから同じ。出力は電源電圧より高い電圧は出ないとの話から、少し下がるらしい。PWMのオシロスコープ出力からもJapaninoだと2.7Vくらいだろうか。
マンガンやアルカリ電池の容量ってどれくらい - Yahoo知恵袋
マイコンへ信号を入力や出力するにはどうすれば - Yahoo知恵袋
5V系・3.3V系信号レベル変換
電源電圧は元々5VのTTLやCMOSが、技術の進歩で3.3Vでも動くようになった事から、端子電圧もHiと判断する電圧が2.5V以上とされたため、3.3Vの電源電圧のマイコンの端子を、TTLの端子に繋いでもちゃんと動作するように余裕を持っている。
だから電源電圧が5Vのマイコンでも3.3Vのマイコンでも、端子電圧が2.5V以上あれば動くようになっているからアマチュアレベルであればOKなのだ。
もちろんサイト様にあるように、低電圧という事はHiと判断する電圧に乱れが乗ると電圧が範囲外に出やすいという事で、電圧ノイズの入りやすい高周波環境や起動時の電圧のゆれに機敏な回路は端子電圧をきちんとしないといけない。
電圧と電流、そして電源と端子、5Vと3.3V。なかなか深い。
するとこちらのサイト様の回路もずっと簡単になる。
WROOM 単体に Arduino スケッチで Wi-Fi ストリーミング - mgo-tec電子工作
こちらの回路だが、

USBシリアル変換は、Arduinoを単体USBシリアル変換器に使用する - 日曜エレクトロニクス(日エレ)で、Japaninoで置き換え、
5V→3.3V変換は、単三電池2本で置き換えられるはず。そしてESP8266は書込み時のみシリアル接続し、通常はarduino化して、I2Cスレーブ化「Arduino同士でI2C通信する方法 - Qitta」で、ATtiny13からI2C通信でアクセスすれば、シリアルの170mAは使わなくて済む。
AD変換もESP8266に1つあるし(それやっちゃうとATtin13の意味が無くなる)、こちらのサイト様の通り4MBもフラッシュあるし。WiFiモジュール(ESP-WROOM-02)
こちらにあるようにATコマンドで行う必要はなくなる。
ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介 - mgo-tec電子工作
必要なのはジャンパ線、(温度センサーLM35DZ、ブレッドボード、ピンヘッダ、ATtiny13、ESP8266、ブレイクアウトボード)それぞれ2組ずつかな。
2mmピッチのピンヘッダとジャンパピンもかな。0.1μFのセラコンも3かな。センサーおよび通信するからね。
第32回 Arduinoマイコンとしても使える小型WifiモジュールESP-WROOM-02を使ってみる(準備編) | Device Plus - デバプラ
あとこちらのサイト様のように、arduinoのEthernet関係のライブラリで直接TCP/IPでPC-Windowsアプリと通信できるはず。
UDPならこちらのサイト様かな。
ESP8266にArduinoスケッチを書き込んでUDPデータ送受信 | ヨンマルマルキュー
Arduinoを使ってWebサーバーをつくろう! | Device Plus - デバプラ
シンプルWin32 アプリケーション for VS Community 2015 ソース (10/30)
パート1:
次のマイクロソフトのサイトのが貼り付けて単にビルドするだけですぐ動いた。
ただしソースは改行がスペースになっていて1行にくっついてしまうので、以下に示す。
プロジェクトはVisual Studio Community 2015 の 「Win32 プロジェクト C++」で、ほぼ空に近いプロジェクトで、ソースファイルを1個新規追加してmain.cppとした。余計なリソースファイルやヘッダファイルやビルドオプションの定義も不要で、外部依存関係が定義されるだけ。環境はWindows10 home 64bit。
チュートリアル: Windows デスクトップ アプリケーション (C++) の作成 - マイクロソフト


ソース:
// GT_HelloWorldWin32.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
// Global variables
// The main window class name.
static TCHAR szWindowClass[] = _T("win32app");
// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Win32 Guided Tour Application");
HINSTANCE hInst;
// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_APPLICATION));
if (!RegisterClassEx(&wcex)) {
MessageBox(NULL, _T("Call to RegisterClassEx failed!"), _T("Win32 Guided Tour"), NULL);
return 1;
}
hInst = hInstance;
// Store instance handle in our global variable
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
HWND hWnd = CreateWindow( szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 500, 100, NULL, NULL, hInstance, NULL );
if (!hWnd) {
MessageBox(NULL, _T("Call to CreateWindow failed!"), _T("Win32 Guided Tour"), NULL);
return 1;
}
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
// Main message loop:
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (int) msg.wParam;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[] = _T("Hello, World!");
switch (message) {
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// Here your application is laid out.
// For this introduction, we just print out "Hello, World!"
// in the top left corner.
TextOut(hdc, 5, 5, greeting, _tcslen(greeting));
// End application-specific layout section.
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
実行するとこんなウィンドウが表示される。

パート2:
こちらもなかなか良かった。
Windows プログラミング I(Win32API)基礎編 - PDF -
最初、こっちをやったのだが、動かなかったのでパート1をやった。
たった1行(HINSTANCE hInstance;)だけ足りなかった。
main.cpp1つに全て記述した。上記のソースと#if #else #endifで区別してある。
ほとんど同じでちょっとだけパート1の方がわざわざ新しいOSに合わせてあるが、パート1のそんな変更は不要だろう。
ソース:
#include <windows.h>
#include <math.h> // 数学関数の呼び出しに必要
HINSTANCE hInstance; // my add
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;
WNDCLASSEX wc; // 新しく作るウィンドウ・クラス
// ウィンドウ・クラス構造体を設定
wc.style = 0; // スタイル(というより「処理」を決めるもの)
wc.lpfnWndProc = WndProc; // ウィンドウ・プロシージャ
wc.cbClsExtra = 0; // 設定用の追加領域
wc.cbWndExtra = 0; //(今回は使わない)
wc.cbSize = sizeof(WNDCLASSEX); // 構造体の大きさ
wc.hInstance = hInstance; // プログラムのハンドル(番号みたいなもの)
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // アイコン
wc.hIconSm = LoadIcon(NULL, IDI_WINLOGO);
wc.hCursor = LoadCursor(NULL, IDC_ARROW); // カーソル
wc.hbrBackground = (struct HBRUSH__ *)GetStockObject(WHITE_BRUSH);
// HBRUSHの後は_が2つ
// クラス・ウィンドウ背景を塗りつぶすブラシ(今回は「白」)
wc.lpszMenuName = NULL; // クラス・メニュー・リソース名
wc.lpszClassName = "ice"; // ウィンドウ・クラス名
// ウィンドウ・クラスを登録
if (!RegisterClassEx(&wc))return 0; // ウィンドウ・クラス登録失敗
// ウィンドウを作成
hWnd = CreateWindow( // ウィンドウ生成
wc.lpszClassName, // ウィンドウ・クラス名
"Windows example", // ウィンドウ名
WS_OVERLAPPEDWINDOW, // ウィンドウ・スタイル
CW_USEDEFAULT, // ウィンドウ表示 X 位置(既定 :0 )
CW_USEDEFAULT, // ウィンドウ表示 Y 位置(既定 :0 )
640, // ウィンドウ X サイズ [dot]
400, // ウィンドウ Y サイズ [dot]
NULL, // 親ウィンドウ・ハンドル
NULL, // メニューハンドル
wc.hInstance, // インスタンスのハンドル
NULL); // 作成時の引数保存用ポインタ
// ウインドウを表示
ShowWindow(hWnd, SW_SHOWDEFAULT); // ウィンドウ表示状態設定
UpdateWindow(hWnd); // ウィンドウの内容の再描画
// メッセー ジ・ループ
while (GetMessage(&msg, NULL, 0, 0)) // メッセージ取得(すべて)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
// ウィンドウ・プロシージャにメッセージを送出
}
return 0;
}
// ウィンドウ・プロシージャ
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,
WPARAM wParam, LPARAM lParam)
{
HDC hdc; // デバイスコンテキストのハンドル
PAINTSTRUCT ps; // BeginPaint関数の引数で使用する
// ペン処理用
HPEN hpen_old; // ペン・ハンドルの保存用
HPEN pen1; // 論理ペン・ハンドル
int i, j = 0, imax, gx, gy;
double pi, x, y;
pen1 = CreatePen(PS_SOLID, 0, RGB(0, 0, 0));// 黒色
switch (iMessage) {
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps); // BeginPaintの開始
TextOut(hdc, 0, 0, "Hello", 5); // 文字列の表示
// ペン処理
hpen_old = (struct HPEN__ *)SelectObject(hdc, pen1);// pen1の選択
pi = atan(1.0) * 4;
imax = 360 * 3;
for (i = 0; i <= imax; i++) {
x = i*pi / 180;
y = sin(x);
gx = (float)500 / imax*i + 40;
gy = 200-y * 80;
if (i == 0) MoveToEx(hdc, gx, gy, NULL);
LineTo(hdc, gx, gy); // sin波の描画
}
SelectObject(hdc, hpen_old); // ペンの解放
EndPaint(hWnd, &ps); // BeginPaintの終了
DeleteObject(pen1); // 論理ペン・オブジェクト削除 my add ここなのね
break;
case WM_DESTROY: // 終了処理
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, iMessage, wParam, lParam);
}
return 0;
}

UnityによるVR動画を中華VR GEARで見たら凄かった (10/29)
以前買ったVR GEAR似の中華HMDで見たら、凄く綺麗でぬるぬる動いて驚いた。

HD 有機EL
4.8インチ
16,777,216色
720×1280ドット
のスペックでも以前のロート製薬の初音ミクVR SPecial Liveより綺麗だ。
ハコスコ等での再生の仕方:
スマホなのでニコニコ動画のアプリを入れて、「ユニティちゃんディレクター杯」でタグ検索をする(ディレクター、はいであって"ディレクタいっぱい"ではない)。

一度このVR動画をアプリをダウンロードしハコスコで一般の人にも見て欲しい。素人でもこんなに簡単に高品質なVR作品を制作できるいい時代になったことを知ってもらいたい。
(やはりコンテンツ自体の問題だったようだ。初音ミクの元々のYoutube映像はautoだと1080なので1280のS3には拡大処理が入るし、VR GEAR用のOculus Storeに移植された方は綺麗だという以下の記事。
【GearVR無料アプリ】ミクのVRライブなど日本発の360度映像を配信する『VR CRUISE』 | Mogura VR - 国内外のVR最新情報
また、Youtubeで解像度指定して再生する以下の方法で、PCで1440で再生してみても気になるアップのシーン(2:13あたり)で解像度が落ちる様子が確認できた。つまりYoutubeに上がってる元のコンテンツが汚かったのだ。YouTubeへのリンクで画質指定する。2015/02版 | 動画素材.com/ブログ。VR CRUISEの方は元の3DCGを映像に落とす際に注意してコンバートしたのだろう)
AVR の基本 (26) (10/29)
前者はCHMファイルなので、ダウンロードしたらプロパティでブロックの解除というボタンを押さないと表示されない。

系統図などAT90S系~ATtiny系~ATmega系までどういう歴史があるかわかって面白い。
また今までいい加減にしていた言葉がきちんと解説されている。(例:低電圧直列プログラミング(ISP) → プログラミングとデバック)
アセンブラも一つ一つの命令が詳しく例文を添えて解説されて分かり易い。

参考にしたサイト様
AVRのマイコンを使おう(電子工作の部屋)
8/13の「小さくて安いマイコン ATtiny13」という記事でコメントがあったのだが、内部クロックを工場出荷時の1MHzから、9.6MHzに書き換える方法をきちんと説明していなかった。
自分でもよくわかっていなかったのだ。
次の記事の「JapaninoでATtiny13 書込み (8/18)」に説明がある。
1)Japaninoをライターの状態にしておく。つまりスケッチ「Arduino ISP」を書込んでおく。
2)記事内の「配線:」の項目で、「Arduino IDEでATtiny他の開発(Arduino-ISP編) - kosakalab」様のサイトから、bitduinoというのをダウンロードする。
3)同様に、記事内の「ATtiny対応bitDuinoのダウンロード:」の項目で、「【AVRマイコン】ArduinoISP + ATTiny2313 - ふふふのブログ」様のサイトの手順に従って、Arduino IDE 0018へ、bitDuinoを導入すると、次のようにマイコンボードにATtiny13の項目がたくさん追加される。

4)そのうちのATtiny13 (internal 9.6 MHz clock)を選び(図ではGakkenになっているが)、[ブートローダを書込む]で、[w/ Arduino as ISP]を選ぶ。
これでATtiny13はブートローダーを書込まれ、bitDuinoになっている。そして一緒にクロック数が9.6MHzになっているはず。確認としてその状態のままBlinkなどのスケッチを書込んでみればLEDの点滅が早くなるのでわかるはず。
ブートローダーはいつものフラッシュ領域とは別の場所に書込まれているので容量が減ることは無い。
あとはいつも通りBASCOM-AVRで好きなプログラムを書込めばよい。
まあ上の手順の1~3はJapaninoをArduino ISPというスケッチでライターにする手順でもうやっているはずだから、遅かったら4だけをやればいいことになる。
参考にしたサイト様
熾火研究所*電子工作室 - 【追加訂正】Japaninoのクロック設定を書き換える方法::補足
1MHzに戻すには、面倒だがboards.txtに1MHzになるように設定を書込んで同じようにするしかない。
中国IoT機器のパスワードの扱い (10/14)
中国のIoTデバイス機器のデフォルトパスワード(内蔵ハードコーディングされている)が60以上あってDDosの原因となったらしい。
50万台のIoTデバイスを乗っ取ったDDoS攻撃「Mirai」の引き金になったダメすぎるパスワード60個 - Gigazine
自分のIT機器が一体いくつ内部で中国製品を使っているか数えられるだろうか?
せっかく中国製を採用したのに、社会的に被害を与える大惨事を引き起こした採用メーカは対応すべき。
社会的信用を軽んじては、国際社会から非難を浴びてしまう。

だいぶ回り道したが、シリアル入力を除いて大体出来てきた。
やはり配線の接触不良やプログラムの勘違いが多かった。
74HC164の信号はA×2とCK×2で別々に制御する。
74HC164APのデータシート(PDF)よりタイミングチャートは以下の通りとなる。

回路図は以下のようになる。
T字路は結線していて、十字路はまたいでいる。抵抗は最上行だけ明るかったので200Ωにした。

実際の実体配線図は以下のように少し面倒である。電源は省略している。



ソース:
'****************************************
' Copyright (c) 2016 k1segawa
' License : free
' Program : 8x8 LED Control
' (by 74HC164)
'****************************************
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 24
$swstack = 8
$framesize = 8
' 74HC164x2 : 1,2
' A= 1 14=VCC
' B= 2 13=QH
' QA= 3 12=QG
' QB= 4 11=QF
' QC= 5 10=QE
' QD= 6 9=XCLR
'GND= 7 8=CLK
' B,XCLR=VCC
' ATtiny13
' PB0=A :1
' PB1=A :2
' PB2=CLK :1
' PB3=CLK :2
Config Portb.0 = Output 'A1(Data 1)
Config Portb.1 = Output 'A2(Data 2)
Config Portb.2 = Output 'CLK(Clock 1)
Config Portb.3 = Output 'CLK(Clock 2)
Config Base = 0 'DIM(0-7)
Const Human = 0 'Human Data=LCD designer
Dim A As Byte , I As Byte , J As Byte , W As Byte
Dim D(8) As Byte , K As Byte
'--- Data Init (Start) ---
Restore Chr_data
Do
#if Human = 0
'--- 8 Bytes = 8 Lines , Data Store ---
For J = 0 To 7
Read A
'--- End Data = Return Start Data ---
If A = 99 Then
Restore Chr_data
Read A
End If
'--- Data Store ---
D(j) = A
Next J
#else
'--- [ Convert Read ] : 8 Bytes = 8 Lines , Data Store ---
For I = 0 To 7
D(i) = 0
Next I
For J = 0 To 7
Read A
'--- End Data = Return Start Data ---
If A = 99 Then
Restore Chr_data
Read A
End If
For I = 0 To 7
'--- Data Store ---
W = &H80
Shift W , Right , I
W = A And W
If W <> 0 Then
W = &H80
Shift W , Right , J
D(i) = D(i) Or W
End If
Next I
Next J
#endif
'=== Repeat Same Data * 10 Loop (=200ms Display) ===
For K = 0 To 9
'--- Matrix LED A1=Char Data Pin 8 bit Shift ---
For J = 0 To 7 'A2 Shift Count (0=QH:b7, 7=QA:b0)
'--- Get 1 Byte Data ---
A = D(j)
'--- A1 74HC164 Shift ---
For I = 0 To 7
W = &H80
Shift W , Right , I 'I=0-7:bit 7-0(&H80,&H40,&H20, ...)
W = A And W 'Char Data bit mask
If W = 0 Then
Portb.0 = 1 'Data 1(A1): OFF=1(reverse)
Else
Portb.0 = 0 'ON=0(reverse)
End If
'--- Clock(CLK 1) ---
Portb.2 = 1 'Low->Hi(Rising Edge)
Portb.2 = 0 'Hi->Low(Falling Edge)
Next I
'--- A2 74HC164 Shift ---
For I = 0 To 7
If I = J Then '1 Line : ON
Portb.1 = 1 'Data 2(A2) : ON=1
Else
Portb.1 = 0 'another 7 Lines : OFF=0
End If
'--- Clock(CLK 2) ---
Portb.3 = 1 'Low->Hi(Rising Edge)
Portb.3 = 0 'Hi->Low(Falling Edge)
Next I
Waitms 2 ' (MAX Wait) Not hi-speed Brinking
Next J
' Not Wait (For V-Sync)
Next K
'=== Repeat End ===
Loop
End
Chr_data:
#if Human = 0
'Byte Data=bit7-0:Left-Right
'7->
'6
'5
'4
'3
'2
'1
'0
Data &H55 , &HFE , &HFC , &HF8 , &HF0 , &HE0 , &HC0 , &H80
Data &H55 , &HFE , &HFC , &HF8 , &HF0 , &HE0 , &HC0 , &H80
Data &H55 , &HFE , &HFC , &HF8 , &HF0 , &HE0 , &HC0 , &H80
Data &HAA , &HFE , &HFC , &HF8 , &HF0 , &HE0 , &HC0 , &H80
Data &HAA , &HFE , &HFC , &HF8 , &HF0 , &HE0 , &HC0 , &H80
Data &HAA , &HFE , &HFC , &HF8 , &HF0 , &HE0 , &HC0 , &H80
#else
'Byte Data=bit7-0:Up-Down
'7 6 5 4 3 2 1 0
'|
'V
' human
Data 8 , 6 , 29 , 4 , 4 , 11 , 9 , 25
Data 8 , 6 , 29 , 4 , 4 , 11 , 9 , 25
Data 8 , 8 , 4 , 12 , 14 , 4 , 10 , 11
Data 8 , 8 , 4 , 12 , 14 , 4 , 10 , 11
#endif
Data 99
' History
' [2016/10/09]
' 74HC164AP-1 reverse
' [2016/10/08]
' Read Convert Human Data (tools>LCD designer)
' [2016/10/07]
' $framesize = 16 -> 8
' Const Human #if Human define
' Data A1,A2 ON/OFF =1/0 (reverse) comment debug
' [2016/10/07]
' Pattern Data: lam mch led matrix 8*8
' URL:https://www.youtube.com/watch?v=U8zDmvD_pmY
Const Human = 1 でHuman、0で標準形式を選択する。パターンデータ1行で200ms表示(10回繰り返している)なので、表示時間を延ばす時はウェイトの代わりにパターン行をコピーする。データの末尾を表す99はビットでデータ保持していた時の名残で、今は99のデータもあり得る。今の所たまたまで、本来は別のやり方で末尾を検知しないといけないが、とりあえずこのままで。
ソース('--- Clock(CLK 1,2) ---の部分)のCLOCKのHi、Lowの説明だが、以下の図のようにCK(CLOCK)はAの値に水色の波線の分だけ経過してから立ち上がり(Rising Edge:赤い矢印)、その後Aの値が変わらないうちに立ち下がる(Falling Edge)。ソースのCLOCKもA1やA2の値を決定した後、(初期値Lowから)Hiになり、そのA1やA2の値が変わる前に(Hiから)Lowになる。

まず、LEDの各ピンにどのLEDが割当たっているか調べるところから始まり、配線をブレッドボードで組み、標準ロジックICのデータシートのタイミングチャートを理解し信号を作る。
8x8LEDと標準ロジックIC間の電流が正しくなく、いくつかのピンに抵抗器を付けたり、その抵抗値も1kΩでは大きすぎて100Ωにしたり、ATtiny13と標準ロジックIC間に全て1kΩの抵抗が必要だったり、いくつも不具合があった。
ATtiny13の出力をダミーLEDに表示させてタイミングが合ってるか調べるたり、8x8LEDに直接ATtiny13からPin出力でHI/LOWをつないで確認したりするなど、テスト回路も作ってみた。
ピン数は5ピンすべて使ってしまっているのでシリアル入力分が無い。回路の見直しをしている。外部電源のGNDを統一する必要もあるかもしれない。
少し時間がかかるが「こぎん」と言われるパターンをPCから与えて表示させる予定だ。
ちなみに今までのプログラムはJapaninoをUSB接続しているので、5V電源で動かしている事を明記していなかった。もちろんArduinoでも動くはず(Japaninoの追加のA6,7ピンは使ってない)。
SPIやOCR0Bを使った比較一致割込みの指定、PCINT1以上での外部割込みもまだだが、AVRマイコンの基本機能はほぼ網羅したと思う。
秋晴れの空 (10/4)
~ 秋高し雲より上を鳥かける ~ 正岡子規

どうやらアップデートマネージャーがWindowsシステムに登録されていたらしい。
どうせ、セキュリティのために自分でもsudo apt-get update/upgradeするつもりだったので、オッケーだ。
ついでにBASCOM-AVRのBASICソースをバージョン管理するのに、gitも入れたい。
/mnt/c/Users/k1segawa/Documents/bascomに保存しているので、そこへ移動してから、
git init
.gitignoreファイル(git排除ファイル)を作成して色々な拡張子を追加しておく。
GUI操作できるようにgit-guiも追加する。パッケージマネージャーをlxterminal上で、
synaptic
と実行し、gitを検索。git-guiをインストール指定。
更新ボタンでインストール後、
gitk
で実行。
tk上のgit履歴ビューアーで、[ファイル][git guiの開始]でgit-guiが起動される。
Raspberry Piでも使って、github.comにも問題なくリポジトリが作れた実績があるので、不安はない。
synapticで詳細情報「Visit Homepage」へのリンクが見れないので、firefoxを導入する。その前にchromeの前身chromiumを入れて見たが実行時ファイルアクセスしたカーネルモジュールがパニックを起こしてコアダンプを吐いたので止めた。
firefox
で実行。沢山エラーを吐くが何とか起動した。

BASCOM-AVRのソースをバージョン管理できるようになったので、同ディレクトリを指定してGit for Windowsでgit-guiを入れてもいいかな。