2016年09月15日

ボクのかんがえたさいきょうのFlashAir拡張ボード

ボクのかんがえたさいきょうのFlashAir拡張ボード。
検討だけ。

・ボード上にはMCUが乗っており、共有メモリを使ってFlashAirと通信する

・共有メモリ上には固定の領域を設けておく。
 デジタル入力(8本?)
 デジタル出力(8本?)
 A/D入力(10bit?5本?)
 PWM出力(サーボ用)(5本?)
 LCD(I2Cでもなんでもいいので適当に)
 UART(つける?)

・一定周期で更新。
 出力は、サイクルごとにメモリを読みだし、に書き込まれた情報通りに出力。
 A/Dや入力も、サイクルごとに行う。
 LCDは、共有メモリ上の更新フラグが立った時、LCDに書き込む感じ。

・MCUはAVRかそこらで実装する。
・MCUの書き換えは想定しない。

・空き領域を使って、特殊コマンドを発行していろいろ出来ると楽しそう?

利点
・共有メモリなので、FlashAir上のLuaや、ブラウザのjavascriptの両方から操作可能。
・入出力が少なく、種類もないFlashAirの欠点をカバーできる
・一般的な5VのI/Oが利用できる
・Wi-Fiを活かせる
・FlashAir側からすれば単に共有メモリへの読み書きであり、プログラムがシンプル
・MCU側で好きなようにできるため、機能の拡張がしやすい

欠点
・共有メモリを扱う都合上、遅い。8MHzで通信しても、書き込み・読み出し合計3ms掛かる。
 いろいろ考えると、200Hzで更新できればいいほうか。
・汎用マイコンでいい気もしないでもない。
・せっかくのPIOやSPI機能を活かせない
・I2CのIOポートエキスパンダーのほうが安価では?
iSDIOとしての通信になるため、SDカードライセンスの問題が出てくる


ライセンスさえ問題なければ、個人で作って売れそうな気もしないでもない。

SDカード対応と謳わなければよいのか?
ArduinoとSDカードシールドなんかのライセンスはどうなってるんだ?
プログラムが入っていなければ問題ないのか?

Airioなんかは、あれはSDカードとしての動作ではないから引っかからないのか?
posted by gpsnmeajp at 23:35| Comment(0) | TrackBack(0) | 未分類

2016年09月09日

FlashAirの共有メモリにアクセスするサンプル

突然、無性にArduinoのSDカードライブラリに頼らず、FlashAirの共有メモリにアクセスしたくなったので。

今後、Luaスクリプトとマイコンの間で通信したくなる機会が増えると思うので、
苦手意識の強かったSDカードコマンドでの通信を試すべきだと思った。

SDカードライブラリに頼らなかったのは、あれがGPLだということと、
PIC等他のC環境で使いたかったため。移植を楽にするため、共有メモリアクセスに特化したかった。

ACMD41での初期化など、色々はまったので、SDカードの初期化の手順的な参考にもなるかもしれない。
プログラム本体は、長いのでサイトの方にあげてある。
https://sites.google.com/site/gpsnmeajp/electricmemo/flashairno-gong-youmemoriniakusesusurusanpuru

DIV4で、512Byteのアクセスに2.5ms程度。
DIV2だと1.8ms程度。
posted by gpsnmeajp at 22:58| Comment(0) | TrackBack(0) | 未分類

2016年09月06日

Grove MP3モジュール v2.0 (KT403A)の仕様について(曲選択機能)

Grove MP3モジュール v2.0 (KT403A)の仕様について。

秋月で売られているKT403Aのモジュールは、安価で、
SDカード(およびUSBメモリ)からmp3音楽を再生できる、非常に便利なモジュールであるが、
曲選択機能においてわかりづらい場所があって困ったので、記録しておく。

このモジュール、単に入れた曲を再生したり、切り替えたりするのは問題ない。
しかし、このモジュールを使いたい多くの人は、特定のmp3ファイルを指定して再生したいだろう。
ここで引っかかりが出る。

まず、予め言っておくが、秋月のページに有る英文データシートは明らかに項目数が少ない。
翻訳の際の誤植もある。中国版データシートを参照することをおすすめする。

ちなみに、通信のチェックサムがさもあるかのように書かれているが、実際に通信する際には
チェックサムは不要である。有効にするオプションが有るのかもしれないが。


まず、最初に、特定のファイルを再生しようとして使うのは、
"Play specific track*" だろう。
Groveのサンプルで言うところの
void SpecifyMusicPlay(uint16_t index)
である。

0x7E 0xFF 0x06 0x03 0x00 FF FF 0xEF
と送れば、65535.mp3が再生される、と思うかもしれない。
実際には、65535番目に記録されたファイルが再生される。

0.mp3
1.mp3
999.mp3

があったとき、
0x7E 0xFF 0x06 0x03 0x00 00 02 0xEF
と送ると、999.mp3が再生される。(02ではなく、03だったかもしれないが)

データシートをよく読むと、「Note that the empty filed need to be filled with specific numbers.」と
書かれているが、それはこの仕様のためである。


"2.3.7 Specify a file to play tracks inside [0x14]"
も同じで、

Play track 0255 (track’s name) in folder 0001 : 7E FF 06 14 00 10 FF FD D8 EF
Play track 1999 (track’s name) in folder 0001 : 7E FF 06 14 00 17 CF FE 01 EF
Play track 0001 (track’s name) in folder 0012 : 7E FF 06 14 00 C0 01 FE 26 EF
Play track 0255 (track’s name) in folder 0012 : 7E FF 06 14 00 C0 FF FD 28 EF
Play track 1999 (track’s name) in folder 0012 : 7E FF 06 14 00 C7 CF FD 51 EF

と書かれていることから、

例えば
7E FF 06 14 00 10 FF FD D8 EF
と送れば、フォルダ0001の、0255.mp3が再生される。
...と思うだろう。実際には、1番目のフォルダの、255番目に記録されたファイルが再生される。
255番目である。ファイル名に関係なく、FATに記録された順番で再生されるらしい。


特定のファイル名を再生したいならば、
"Specify a certain folder and play tracks inside [0x0F]"
Groveのサンプルで言うところの
void SpecifyfolderPlay(uint8_t folder, uint8_t index)
を使う必要がある。

Specify folder name 01 and track name 001xxx.mp3 7E FF 06 0F 00 01 01 EF
Specify folder name 11 and track name 100xxx.mp3 7E FF 06 0F 00 0B 64 EF
Specify folder name 99 and track name 255xxx.mp3 7E FF 06 0F 00 63 FF EF

※255が誤植で001になっているので注意。

これも表記がわかりにくいのだが、

Specify folder name 01 and track name 001xxx.mp3 7E FF 06 0F 00 01 01 EF
というのは、つまり、01という名前のフォルダの、001から始まるファイル名が再生されるということである。
中国版データシートでは、スクリーンショットとともに丁寧に説明されている。

つまり、
01\001Test.mp3 → 7E FF 06 0F 00 01 01 EF
01\002Wow.mp3 → 7E FF 06 0F 00 01 02 EF
02\255Buzz.mp3 → 7E FF 06 0F 00 02 FF EF
ということである。

もちろんこちらは空のファイルで埋める必要はない。きちんとファイル名で再生してくれる。

とりあえず以上。
posted by gpsnmeajp at 21:17| Comment(0) | TrackBack(0) | 未分類

2016年09月05日

Pebble Timeのファームウェアが4.0になった。

Pebble Timeのファームウェアが4.0になった。
メニュー画面がシンプルになり、アイコンが表示されてわかりやすくなった。


また、QuickViewが追加され、近いイベントがウォッチフェイスに表示されるようになった。
ところがこれが曲者で、自作のWatchFaceは、ちょうどQuickViewにすっぽり隠れる位置に
情報を集約させているため、時計が見えなくなってしまうのだ。

時計が見えず、次の予定までの時間のみが見える時計、というのも、悪くはないかもしれないが困る。
一応、設定からQuickViewを無効にすれば今までどおりに使えるのだが、
せっかくのスマートウォッチな機能を無効にするのもアレである。

ので、QuickViewが表示されるときは、単にWatchFace全体を上にずらすことにした。単純明快である。

しかし、Pebble公式SDKの解説がわかりづらくて困った。自分の読解力がないだけかもしれない。
ようは簡単な話で、

今まで、
   GRect bounds = layer_get_bounds(window_layer);
で得ていた全画面の描画領域を、
   GRect bounds = layer_get_unobstructed_bounds(window_layer);
に置き換えて、座標指定を相対化してあれば勝手にずれる、という話なのだが、
自作のWatchFaceはそれではうまくいかない。

結局、描画オブジェクトを1枚のレイヤーに集約し、

   GRect QVbounds = layer_get_unobstructed_bounds(window_layer);
   layer_set_bounds(all_layer, GRect(0, QVbounds.size.h +(0-168), QVbounds.size.w, 168));
で移動。

しかしこれでは、表示中にQuickViewが現れた場合に対応しないので、
//unobstructedハンドラ
static void prv_unobstructed_will_change(GRect final_unobstructed_screen_area,
void *context) {
  GRect bounds = final_unobstructed_screen_area;
  layer_set_bounds(all_layer, GRect(0, bounds.size.h +(0-168), bounds.size.w, 168));
}

//unobstructedハンドラ
static void prv_unobstructed_did_change() {
   Layer *window_layer = window_get_root_layer(s_main_window);
  GRect bounds = layer_get_unobstructed_bounds(window_layer);

  layer_set_bounds(all_layer, GRect(0, bounds.size.h +(0-168), bounds.size.w, 168));
}
を追加。

static void main_window_load(Window *window) 
  //画面領域サービス(Quickview)に登録する
  UnobstructedAreaHandlers handlers = {
    .will_change = prv_unobstructed_will_change,
    .did_change = prv_unobstructed_did_change
  };
  unobstructed_area_service_subscribe(handlers, NULL);
を追加。

でなんとかなった。
詳細は後でサンプルを上げようと思う。

posted by gpsnmeajp at 23:06| Comment(1) | TrackBack(0) | 未分類

2016年09月01日

ポテンシャル法のC言語での実装例

ロボットの障害物回避などに使われる、ポテンシャル法のC言語での実装例
(あっているかは不明なので、参考程度に)


なんで調べても数式ばっかりで実装例が出てこないんだろう?


*ポテンシャル場の確認
#include <stdio.h>
#include <math.h>

double get_pot(double x, double y)
{
const double Enemy1_x = 5.;
const double Enemy1_y = 10.;

const double Enemy2_x = -10.;
const double Enemy2_y = -20.;

const double Goal_x = 17.;
const double Goal_y = 0.;

const double Weight_Enemy1 = 1.0;
const double Weight_Enemy2 = 1.0;
const double Weight_Goal = 5.0;

//スカラー場なのでx,y成分共に同じ
double Enemy1_pot = 1.0 / sqrt((x - Enemy1_x)*(x - Enemy1_x) + (y - Enemy1_y)*(y - Enemy1_y));
double Enemy2_pot = 1.0 / sqrt((x - Enemy2_x)*(x - Enemy2_x) + (y - Enemy2_y)*(y - Enemy2_y));
double Goal_pot = -1.0 / sqrt((x - Goal_x)*(x - Goal_x) + (y - Goal_y)*(y - Goal_y));

double pot = Enemy1_pot * Weight_Enemy1 + Enemy2_pot * Weight_Enemy2 + Goal_pot * Weight_Goal;
return pot;
}

int main(void)
{
FILE *fp = fopen("output.txt", "w");
if (fp == NULL)
{
printf("Err\n");
return -1;
}

printf("wait...\n");

const double delta = 0.1;
const double max = 1.0; //上限(発散部分除外)
// const double zoom = 10.;
for (double x = -30; x < 30; x += delta)
{
for (double y = -30; y < 30; y += delta)
{
double pot = get_pot(x, y);
if (pot > max)
pot = max;
if (pot < -max)
pot = -max;


fprintf(fp, "%lf,%lf,%lf\n", x, y, pot);
}
fprintf(fp, "\n");//pm3dは空行がないと補完しない
}
fclose(fp);
printf("Done\n");

return 0;
}


*GNUPLOTスクリプト
set pm3d corners2color max
set pm3d depthorder
set datafile separator ","
set xrange[-30:30]
set yrange[-30:30]
#set view map
splot "output.txt" with pm3d


*結果


*勾配ベクトル場の確認
#include <stdio.h>
#include <math.h>

double get_pot(double x,double y)
{
const double Enemy1_x = 5.;
const double Enemy1_y = 10.;

const double Enemy2_x = -10.;
const double Enemy2_y = -20.;

const double Goal_x = 17.;
const double Goal_y = 0.;

const double Weight_Enemy1 = 1.0;
const double Weight_Enemy2 = 1.0;
const double Weight_Goal = 5.0;

//スカラー場なのでx,y成分共に同じ
double Enemy1_pot = 1.0 / sqrt((x - Enemy1_x)*(x - Enemy1_x) + (y - Enemy1_y)*(y - Enemy1_y));
double Enemy2_pot = 1.0 / sqrt((x - Enemy2_x)*(x - Enemy2_x) + (y - Enemy2_y)*(y - Enemy2_y));
double Goal_pot = -1.0 / sqrt((x - Goal_x)*(x - Goal_x) + (y - Goal_y)*(y - Goal_y));

double pot = Enemy1_pot * Weight_Enemy1 + Enemy2_pot * Weight_Enemy2 + Goal_pot * Weight_Goal;
return pot;
}

int main(void)
{
FILE *fp = fopen("output.txt", "w");
if (fp == NULL)
{
printf("Err\n");
return -1;
}

printf("wait...\n");

const double delta = 1.2;
// const double zoom = 10.;
for (double x = -30; x < 30; x += delta)
{
for (double y = -30; y < 30; y += delta)
{
//勾配ベクトル算出 -grad(P)
double vx = -(get_pot(x + delta, y) - get_pot(x, y))/delta;
double vy = -(get_pot(x, y + delta) - get_pot(x, y))/delta;
double v = sqrt(vx*vx + vy*vy);

// vx *= zoom;
// vy *= zoom;
//見やすさのためにベクトルを正規化
vx /= v;
vy /= v;

// printf("%lf,%lf,%lf\n", x, y);
if(!isnan(vx) && !isnan(vy)) //無効な値は除外
fprintf(fp, "%lf,%lf,%lf,%lf,%lf\n", x, y, vx, vy,v);
}
// fprintf(fp, "\n");//pm3dは空行がないと補完しない
}
fclose(fp);
printf("Done\n");

return 0;
}


*GNUPLOTスクリプト
set datafile separator ","
set xrange[-30:30]
set yrange[-30:30]
set size ratio 1
set palette rgb 33,13,10
#plot "output.txt" u 1:2:3:4:(sqrt($3*$3+$4*$4)) w vector lc palette ti ""
plot "output.txt" u 1:2:3:4:5 w vector lc palette ti ""


*結果

*ポテンシャル法による障害物回避
#include <stdio.h>
#include <math.h>

double get_pot(double x, double y)
{
const double Enemy1_x = 5.;
const double Enemy1_y = 10.;

const double Enemy2_x = -10.;
const double Enemy2_y = -20.;

const double Goal_x = 17.;
const double Goal_y = 0.;

const double Weight_Enemy1 = 1.0;
const double Weight_Enemy2 = 1.0;
const double Weight_Goal = 5.0;

//スカラー場なのでx,y成分共に同じ
double Enemy1_pot = 1.0 / sqrt((x - Enemy1_x)*(x - Enemy1_x) + (y - Enemy1_y)*(y - Enemy1_y));
double Enemy2_pot = 1.0 / sqrt((x - Enemy2_x)*(x - Enemy2_x) + (y - Enemy2_y)*(y - Enemy2_y));
double Goal_pot = -1.0 / sqrt((x - Goal_x)*(x - Goal_x) + (y - Goal_y)*(y - Goal_y));

double pot = Enemy1_pot * Weight_Enemy1 + Enemy2_pot * Weight_Enemy2 + Goal_pot * Weight_Goal;
return pot;
}

int main(void)
{
FILE *fp = fopen("output.txt", "w");
if (fp == NULL)
{
printf("Err\n");
return -1;
}

printf("wait...\n");

//出発地点
double x = -10.;
double y = 20.;

const double delta = 0.1;
const double speed = 0.1;
for (int i = 0; i < 1000;i++)
{
//勾配ベクトル算出 -grad(P)
double vx = -(get_pot(x + delta, y) - get_pot(x, y)) / delta;
double vy = -(get_pot(x, y + delta) - get_pot(x, y)) / delta;
double v = sqrt(vx*vx + vy*vy);


//ベクトルを正規化
vx /= v / speed;
vy /= v / speed;

//移動反映
x += vx;
y += vy;

fprintf(fp, "%lf,%lf,%lf,%lf,%lf\n", x, y, vx, vy, v);
}
fclose(fp);
printf("Done\n");

return 0;
}


*GNUPLOTスクリプト
set datafile separator ","
set xrange[-30:30]
set yrange[-30:30]
set size ratio 1
set palette rgb 33,13,10
#plot "output.txt" u 1:2:3:4:(sqrt($3*$3+$4*$4)) w vector lc palette ti ""
plot "output.txt" u 1:2:3:4:5 w vector lc palette ti ""


*結果

追記: コメントにスカラー場なので」と書いてしまっているが、x,yによらず同じ形状なので、が正しいか。

posted by gpsnmeajp at 00:15| Comment(0) | TrackBack(0) | 未分類

2016年08月19日

Mighty1284Pのヒューズ設定について

とある目的で、大容量なROMとRAMを積んだArduinoが必要になったので、
ATMEGA1284PをArduino化しようとしたのだが、
その際に使おうとしたMighty-1284Pでハマったので書いておく。

optiboot導入後。

症状は、短いスケッチで書き込みエラーが2回に1回出る。
長いスケッチは毎回エラーが出る。
シリアル通信をエコーバックするだけのスクリプトが正常に動かない。

原因は、ヒューズビットの問題であった。
セラロックが使えない、という問題で既知であるが、水晶でもおかしくなる。

参考にしたのはここ
http://www.avrfreaks.net/forum/mega1284p-usart-receiver-issues-solved

スレ主は、ローパスフィルタを付けて解決していたが、実際には一番下にある
ヒューズビットの修正を行うことで解決する。

具体的には、Mighty-1284Pに同梱されたboard.txtを中身を開き、
各ヒューズの設定を以下のように書き換える。
(デフォルトでは、0xff, 0xde, 0xfdになっているらしい。)

これで安定する。

mighty_opt.bootloader.low_fuses=0xf7
mighty_opt.bootloader.high_fuses=0xd6
mighty_opt.bootloader.extended_fuses=0xfd

avr_developers.bootloader.low_fuses=0xf7
avr_developers.bootloader.high_fuses=0xd6
avr_developers.bootloader.extended_fuses=0xfd

bobuino.bootloader.low_fuses=0xf7
bobuino.bootloader.high_fuses=0xd6
bobuino.bootloader.extended_fuses=0xfd

mighty.bootloader.low_fuses=0xf7
mighty.bootloader.high_fuses=0xd6
mighty.bootloader.extended_fuses=0xfd

mighty8.bootloader.low_fuses=0xf7
mighty8.bootloader.high_fuses=0xd6
mighty8.bootloader.extended_fuses=0xfd


関係ないが、AVRISP mkIIをArduino IDEから使おうとすると、libUSBが必要だが、
64bit環境のWindowsの場合は、binの中にある、inf-wizard.exeを管理者権限で実行し、
さらにウィザード中の「Install Now...」を使わないと正常に入らないので注意。


ちなみに、ヒューズビットの意味
FF DE FD
11111111 11011110 11111110

CKDIV8 = 1
CKOUT = 1
SUT1 = 1
SUT0 = 0
SKSEL3 = 1 外部クリスタル、低振幅で発信(デリケートなクリスタル用)
SKSEL2 = 1
SKSEL1 = 1
SKSEL0 = 1

OCDEN = 1
JTAGEN = 1
SPIEN = 0
WDTON = 1
EESAVE = 1
BOOTSZ1 = 1
BOOTSZ0 = 1
BOOTSZT = 0

BODLEVEL2 = 1
BODLEVEL1 = 1
BODLEVEL0 = 0

---

F7 D6 DE
11110111 11010110 11111110

CKDIV8 = 1 クロック分周無効
CKOUT = 1 クロック出力無効
SUT1 = 1 パワーアップ待機時間16Kサイクル(リセット時は14サイクル+4.1ms)
SUT0 = 0
SKSEL3 = 0 外部クリスタル、最大振幅で発信(通常のクリスタル用)
SKSEL2 = 1
SKSEL1 = 1
SKSEL0 = 1

OCDEN = 1 デバッグ禁止
JTAGEN = 1 JTAGは拒否
SPIEN = 0 SPIプログラミングは許可
WDTON = 1 ウォッチドックタイマは無効
EESAVE = 0 EEPROMをイレースから保護する
BOOTSZ1 = 1
BOOTSZ0 = 1
BOOTSZRST = 0 リセットベクタはブートローダー

BODLEVEL2 = 1
BODLEVEL1 = 1
BODLEVEL0 = 0

posted by gpsnmeajp at 22:20| Comment(0) | TrackBack(0) | 未分類

2016年07月16日

DJI Inspire-1の送信機(RC)のアップデートが行われない場合

DJI Inspire-1の送信機(RC)のアップデートが行われない場合。

職場でひさしぶりにDJI Inspire-1を飛ばそうと思ったら、いつものごとく
「アップデートしろ」警告が出た。

いつものように、DJI公式サイトからアップデータをダウンロードすると、
機体・カメラ・バッテリーのアップデートは正常に終わったのだが、
(SDカードが破損していてフォーマットしたりなんていうことはあったのだが)
送信機のアップデートだけ何故か行われない。

ログを確認してみると、「アップデータが古いからアップデートしなかったよ。これ最新」
みたいなことを吐きやがる。

しかし、iPadを繋いでDJI GOアプリを使うと「1.3.0以上に送信機をアップデートしないと、
アプリからのアップデートはできねぇよ」的なエラーを吐きつづける。

数時間格闘し続け、Hard Resetなども試して、結局わかったこと。

どうやら、最近のアップデータには送信機用のアップデータが含まれていないらしい。
ここのサイト(日本の正規代理店)から、2015年8月の「INSPIRE 1 ファームウェア v1.3.0.0」を
ダウンロードし、送信機のアップデートをすると、アプリからアップデートが可能になる

ので、あとはUSBでiPadを繋いでアップデートすれば良い。

ひどい時間がかかった。
というか酷い罠だ。1.3.0以上ではなく、1.3.0が必要だとは。
(頻繁にアップデートしていれば、近い時期のファームには含まれていたのかもしれない)。

以上。


posted by gpsnmeajp at 23:23| Comment(0) | TrackBack(0) | 未分類

豊四季タイニーBASICのメモ

タイニーBASICをCで書く を購入した。
中身はTTBASIC(豊四季タイニーBASIC)の解説だ。

Tiny BASICをC言語で実装した例はいくつかあるが、
その中でも移植性とわかりやすさに重点を置き、拡張性も高く設計されていることが
ソースコードを読んでわかったので本を購入した。

中心部分は変わらず、各機種対応のプロジェクトファイルが配られているのだが、
Arduino版のソースコードに至っては1行ごとに日本語のコメントが付いている。
C言語が読め、TinyBASIC全体の知識がある人ならそれだけで理解・改造ができるだろう。

自分は、一部のデータ構造の意味などがわからなかったので本を購入したのだが、
図や筆者の言葉でしっかりと全体的な説明がなされており、さらにSAVE・LOAD命令などの
実装例も乗っていたので、かなり助かった。

ただ、初心者向きではない。C言語に関する説明はないからだ。
あくまで、C言語でプログラム作るのにある程度なれており、BASICを導入したいと
考えた人向けだ。

また、TTBASICには機種依存性をなくすため、本当に最低限の機能しかついていない。
改造して使いたい人でないと本を買う意味は無いだろう。

私はこれから、個人用に拡張したBASIC環境を構築しようと考えている。

その上での色々なメモを此処に書いていこうと思う。

・64bit環境では動作しない
 64bitのWindows環境で実行しようとすると、コンパイル時にポインタの型変換に警告が出る。
 「64bitのポインタを32bitで受けようとしているぞ」というもので、
 その状態で構造文(FOR等)を実行すると「スタック足りない」エラーが出る。
 型を変更するか、32bit環境で動かすことをおすすめする。
 もっとも、TTBASIC自体、組み込みなどの環境向けなので、
 64bitなんて贅沢な環境のことは考えていないのだろう。

・Windowsのおせっかい
 debugで実行すると、時折エラーを吐いて落ちることがある。
 関数の戻り値が代入されていない、など。
 設計者の思想的に、エラーで戻るときには戻り値は使われないため、
 ROMを節約するためか、何の値も代入されないようだ。
 正直Windowsの開発者向けおせっかい機能だが、それを切るか、治すかすると良いだろう。
 っていっても、こんなの書かなくても見りゃわかると思うけれども。

改造したものは以下においてある。
https://sites.google.com/site/gpsnmeajp/ttbasic
posted by gpsnmeajp at 23:15| Comment(0) | TrackBack(0) | 未分類

2016年06月30日

LUA_RUN_SCRIPTが動かない時の切り分け方

※本情報は、参考のために残しており、古い情報を含みます。
現在主に更新しているのはwikiですので、最新の情報はwikiを参照してください。

FlashAir開発者向け非公式wiki


---

FlashAirのLuaスクリプト実行機能に、
起動時に実行する"LUA_RUN_SCRIPT"という設定がありますが、これが結構クセモノです。

なにがクセモノかというと、スクリプトでエラーが起きたことを知る手段がありません。
それだけなのですが、それが本当に致命的。文法エラーひとつわからない。

ので、そんな時の切り分け方を以下に記します。

0. ファームウェアバージョンを確認する
 CONFIGファイルのVERSIONを確認してください。
末端がW3.00.00の場合は古いバージョンですので、ファームウェアアップデートをしてください。
Luaスクリプトの実行に関していくつものバグが有ります。

1. ブラウザから実行できるか確認する
 起動時に動くスクリプトなら、ブラウザからも実行できるはずです。
公式チュートリアルだとなぜか、一番最初にやることが起動時に実行になってますが、
正直ハマります。まずはブラウザからLuaスクリプトを叩いて実行できるか確認しましょう。
それで実行できないものはそもそも起動時にも実行できません。
FlashAirでは、実行エラーは出力なしのだんまりになります。

ちなみに、手前味噌ですが、FlashTools Lua EditorのDebug機能を使うと、
具体的に何のエラーが起きているのか知ることができます。

2. CONFIGの記述ミスをしていないか確認する。
 スペルミスをしていませんか?
最終行を空行にしていますか?

3. ファイル書き込みの場合: 差し込んで、10秒待って抜いて、また差し込んでみる
 ファイルはブラウザ上ではリアルタイムに更新されますが、
PCなどからは確認できないことが多いです。
というのも、差込時に読み出し、その後の変化は知らんぷりなためです。
なので、実行が終わった辺りで差し込み直すといいでしょう。
ちなみに、LUA_RUN_SCRIPTは暴走防止等で、起動から実行まで最低5秒くらい待たされます。

4. 通信系の場合: スクリプトの頭に30秒〜60秒くらいの待ち時間を入れてみる
 割と見落としがちなのですが、LUA_RUN_SCRIPTはWi-Fi接続が確立する前から
実行が始まります。ので、スクリプト起動後すぐにfa.requestなどの通信をしようとしても、
どうやってもうまく行きません。
ブラウザでは動くのに起動時に動かないの大抵はこれです。

おまけ. fa.pioを叩きまくるとホスト機器と通信不能になります。
 スクリプト内でfa.pioをループで叩き続ける場合は、必ず成功可否をチェックし、
(少なくともスクリプトの頭でチェックし)失敗している場合は無理に叩き続けないようにしましょう。
起動猶予時間を使えば脱出は可能ですが、半分文鎮みたいになります。


参考になれば幸いです。

ほかいろいろ
https://sites.google.com/site/gpsnmeajp/electricmemo/flashair

あわせてこちらもどうぞ。
FlashAirからfa.requestを投げる時の注意
FlashAirでLuaスクリプトを組む時のコツ
fa.spiの挙動(秋月 FlashAir DIP IOボードキットでfa.spiが動かない問題)
#FlashAir をいじっている記録
FlashAir上でLuaスクリプトのエラーを表示する

おすすめ
FlashTools Lua Editor (FTLE)
posted by gpsnmeajp at 22:16| Comment(1) | TrackBack(0) | 未分類

2016年06月25日

FlashAirのレジスタから時刻を得る


libFlashTimeでは、現在時刻の取得にファイル書き込みをして、
その更新日時を取り出すということをしていた。

当然、フラッシュに書き込みが発生するので、寿命が縮む。

しかし、最近更新されたFlashAir開発者サイトのレジスタマップを確認すると、
ReadStatusRegで取り出せる情報の中にDate,Timeがあることに気づいた。

ので実装。

DL = string.sub(fa.ReadStatusReg(),225,226)
DH = string.sub(fa.ReadStatusReg(),227,228)
TL = string.sub(fa.ReadStatusReg(),229,230)
TH = string.sub(fa.ReadStatusReg(),231,232)
z = tonumber(DH..DL..TH..TL,16)
Year,Month,Day,Hour,min,sec = t.GetLocalTimeFromFATtime(z);
print("RegTime "..Year.."/"..Month.."/"..Day.." "..Hour..":"..min..":"..sec.."");

これで、フラッシュに書き込むこと無く、時刻を取得できる。

おわり。
後々、libFlashTimeに関数として実装する予定。
posted by gpsnmeajp at 00:32| Comment(0) | TrackBack(0) | 未分類

2016年06月24日

PebbleのアプリをC言語とPebble.jsで開発する時の違い

スマートウォッチのPebbleを便利にしているのは、通知機能とアプリである。
アプリはストアで配布されているが、自分好みのものがないということはよくあることだ。

開発環境はCLOUDPEBBLEを使えば何の問題もない。

オフラインで開発しようとすると、Linux仮想マシンにSDKを導入する必要があるが、
CLOUDPEBBLEを使えばオンラインで、Webブラウザ上で全てが完結する。
コンパイルも、エミュレータも、Pebbleへの転送もだ。

スマートフォンのPebbleアプリに、Developer機能が付いているので、
同じPebbleアカウントでログインしていれば、
クリックひとつでコンパイルされたアプリが手元のPebbleに自動でインストールされる。

ところで、問題がひとつ。
Pebbleのアプリを書く手段というのは、3種類ある。

・C言語で開発する
・Simply.jsで開発する
・Pebble.jsで開発する

の3種類だ。
この3種類の違いが個人的にわかりにくくて困ったので、メモをしておく。


・C言語で開発する
Pebbleにおける標準的な開発方法だ。
すべての機能を活かすのなら、これを使うしか無い。
文字盤(ウォッチフェイス)を作成できるのもこれしかない。

ウォッチフェイスのサンプルデータはここにある。

プログラムの実行速度は高速で、
使える機能は多く、
そして、省電力でもある。

また、一度インストールが済まされていれば、
スマートフォンと切断されていても(機内モードでも)アプリは動作する。

問題があるとするなら、C言語なので面倒が多いことだ。
配慮はされていて作りやすいが、割りと手間がかかる。

特に、スマートフォンアプリとの通信PebbleKitや
Pebbleアプリに読み込ませたJavaScriptのPebbleKitJSと通信するあたりが、
ちょっと面倒なように思う。

外部(サーバーなど)との通信もPebbleKitか、PebbleKitJSを経由する必要がある。


・Simply.jsで開発する
C言語での開発が面倒なので作成された「アプリ」である。
アプリの設定画面からURLを指定すると、
そのURLの先のJavaScriptを読み込んで実行する。

画像表示などの機能が使えないが、
UI機能は概ね使えるし、通信もajaxで簡単。

しかし、あくまで他人のアプリの上で動く。


・Pebble.jsで開発する
Simply.jsを単体のアプリ化したものである。
公式機能のため、画像表示機能が使え、その他多くの機能が使えるが、
一部使えない機能があるようだ。

Simply.jsもそうなのだが、実体はPebble上にはなく、スマートフォン上のPebbleアプリで動く。
Pebble上にインストールされるアプリは、実質クライアントである。

どういうUIを表示するか、どういうアクションをするかは、
PebbleがBluetooth経由でスマートフォンに問い合わせ、
スマートフォン上のJavaScriptが返答、それをPebbleが表示、という仕組みになる。

ので、
 ・省電力ではない
 ・スマートフォンと切断されている状態では使えない
 ・ウォッチフェイスが作れない
 ・レスポンスが悪い
 ・まだベータ版
 ・たぶんストアでまだ配布できない?
という、一見利点がないように思えるが、

Pebble上のアプリとしては完成品で、それをJSから操作する形になるため、
 ・Cのように機種別に作り分ける必要が(あんまり)ない
 ・かなり手軽にアプリが組める
 ・ajaxを用いてかなり容易に外部と通信できる
 ・C言語の面倒臭さがない
という大きな利点がある。

こんなのが作れる。


・結論
省電力で作りたい、ウォッチフェイス作りたい、
単体で動いて欲しい、レスポンスがいいのがいい、
ばりばりアニメーション/ゲーム作りたい、
という場合には、ネイティブC言語開発。

スマートウォッチらしく、スマホとつながっている時だけ動けばいい、
ネットから情報を取り出したい、送りたい、
とりあえず動けばいい、
という場合には、Pebble.jsがおすすめ。
もちろんのこと、Cでできないことはないです。







posted by gpsnmeajp at 23:17| Comment(0) | TrackBack(0) | 未分類

2016年06月19日

コスプレーヤーの衣装用電飾基板を作成した

とある知人のコスプレーヤーに「色が変えられて、RGBのLEDが30個くらい駆動できる
(全部同じ色でいい)イルミネーション基板がほしい」と言われたので、
ささっと作った記録を上げておく。

わりと検索しても出てこないので。



要件
・RGB-LED x30 = (20mA x3=) 60mA x 30 = 1.8A(各ch 600mA)の制御に耐えられるようにする。
・電源を別に背負うのも、電池というのもあれなので、モバイルバッテリー供給とする。
・簡単にプログラムがいじれるようにArduino Nano(依頼者のもの)を使用する。
・ボタン2つで色が変えられるようにする。
・デバッグが容易なように、基板上にスイッチとモニタ用LEDを付けておく。
・保護回路は省略。モバイルバッテリーの保護頼みである。

工夫
・MOS-FETでLEDを駆動するため、電源が許す限りかなりの量をつけられる。
 (正直オーバースペックだったと思う)
・電源分離用のジャンパを付けてあるため、マイコンの電源がLEDに振られてリセットされるようなら
 Arduino Nanoに付いているUSBコネクタから別途電源供給することで動かせるようにしている。
・LEDのパターンは色相を回すことにした。一番実装が楽だったので。
・Arduinoの浮動小数点演算は割と酷く遅くはないことがわかった。
・PWM出力複数付いているのは本当にいいことだと思う。


回路図

部品表

品名 単価 数量 小計 URL
角型フルカラーLED OSTA71A1D−A アノードコモン (10個入) 450 4 1800 http://akizukidenshi.com/catalog/g/gI-01444/
NchパワーMOSFET 2SK2232(60V25A) 100 5 500 http://akizukidenshi.com/catalog/g/gI-02414/
基板取付用USBコネクタ(Bタイプ メス) 50 2 100 http://akizukidenshi.com/catalog/g/gC-00161/
ピンヘッダ (オスL型) 1×40 (40P) 50 1 50 http://akizukidenshi.com/catalog/g/gC-01627/
分割ロングピンソケット 1x42 (42P) 80 1 80 http://akizukidenshi.com/catalog/g/gC-05779/
タクトスイッチ(黒色) 10 8 80 http://akizukidenshi.com/catalog/g/gP-03647/
絶縁ラジアルリード型積層セラミックコンデンサー0.1μF50V2.54mm(10個入) 100 1 100 http://akizukidenshi.com/catalog/g/gP-00090/
電解コンデンサー10μF50V85℃ (ルビコンPK) 10 3 30 http://akizukidenshi.com/catalog/g/gP-03116/
カーボン抵抗(炭素皮膜抵抗) 1/4W 1kΩ (100本入) 100 1 100 http://akizukidenshi.com/catalog/g/gR-25102/
カーボン抵抗(炭素皮膜抵抗) 1/4W 100Ω (100本入) 100 1 100 http://akizukidenshi.com/catalog/g/gR-25101/
カーボン抵抗(炭素皮膜抵抗) 1/4W 180Ω (100本入) 100 1 100 http://akizukidenshi.com/catalog/g/gR-25181/
カーボン抵抗(炭素皮膜抵抗) 1/4W 220Ω (100本入) 100 1 100 http://akizukidenshi.com/catalog/g/gR-25221/
Arduino Nano 0 在庫品を利用
送料 500
合計 3640


操作方法
スイッチA短押し カラーパターン インクリメント
スイッチB短押し カラーパターン デクリメント
スイッチA長押し 常時点灯・点滅切り替え
スイッチB長押し 消灯切り替え
スイッチAB長押し 設定リセット

カラーパターンはEEPROMに記録され、次回起動時も再現される。


プログラム
※表示されない場合は少し待ってください。それでもダメな場合はリロード



・後記
作ってから気づいたが、

エーモン RGBカラー LEDコントローラー 1854 エーモン工業 (amonkogyo) https://www.amazon.co.jp/dp/B00EXGS9FK/ref=cm_sw_r_tw_dp_q.HzxbDBYD8C6
に機能が似ている。
もっとも、こちらは点滅もしなければ、点滅パターンの調整やカスタマイズも効かない。

12Vの電源が用意でき、各chのLED駆動電流が500mAまでに収まり、
かつ点滅が不要ならば、こちらを買うと完成品が1200円程度で済むので、
そちらがおすすめである。

posted by gpsnmeajp at 13:18| Comment(0) | TrackBack(0) | 未分類

2016年06月03日

Windows10にしたらやたら音飛びするときに軽減する方法

Windows8.1までは問題なかったのに、Windows10にしたらやたら音飛びするときに軽減する方法。

ほとんどこのページの引き写しですが。
https://wp.bmemo.pw/128

LatencyMonおよび、DPC Latency Checkerを入れてチェックしてみる。
たいてい、音が飛ぶ瞬間に赤色になるはず。

解決方法としては、デバイスマネージャから、デバイスを片っ端からオンライン更新を書けた。
Realtekのオーディオ、LAN関係や、Intelの色々が更新された。

追加で、無駄に色々入っていたイーサネット関係を、1つを残して無効化。
これで少しましになったきはするが、平均値は高いままだ。

どこかに問題があるのであろう雰囲気はする。
Win8.1では問題なかったのだがなぁ...

追記2017-08-17
クリーンインストールで治った。うーん、しょうもない。
posted by gpsnmeajp at 23:34| Comment(0) | TrackBack(0) | 未分類

2016年04月03日

Wi-Fi経由でIOポート入出力(LED点灯やスイッチの確認)をする手段としてのFlashAirの使い方

※簡単な電子回路の知識があることを前提としています。
 例えば、オルゴールICにスピーカーを繋いで鳴らせる程度。

USBでなんかIOポートを操作したい、となったら、Arduino+Fermataが一番おすすめですが、
Wi-Fi、それもスマートフォン等と組み合わせたいとなったら、FlashAirがおすすめです。
ESP8266が価格の面ではまさりますが、FlashAirは最初からWebサーバー機能などが
乗っているため、いろいろなセットアップの手間が省けます。


1. 秋月で部品を買う。
 秋月電子通商で以下のものを買います。
 ブレッドボードや、はんだこで等も、無かったら買ってください。
 (IOボードキットの端子の組立にハンダとはんだこでが必要です。
 電源は5V〜9Vをおすすめします。単三電池4本でOKです。
2. FlashAirのアップデートをします。
 こちらから、アップデータをダウンロードして、インストール。その後、実行して下さい。
 これをしないと、FlashAirの機能の一部が使えません。というか、これからの手順が失敗します。

3. AE_FAIO_HTTP_IO
 FlashAirに、ここからダウンロードしたzipファイルを解凍して突っ込む
 
4. FlashAirを、IOボードキットに差し込み、電源をつなぐ。
 PCやスマホから、FlashAirという名前のアクセスポイントに繋ぎます。
 パスワードは「12345678」

5. 自動セットアップ
 ブラウザでhttp://flashair/にアクセスすると、
 AE_FAIO_HTTP_IOというフォルダの中に、setup.luaというのがあります。
 ので、実行すると、FlashAirの一部の設定を自動でやってくれます。

6. さあためそう。
 指示の通り、一旦FlashAirを抜き差ししてから、再度PC・スマホを接続します。
 あとは、AE_FAIO_HTTP_IOの中のhelp.htmを見てみてください。
 そこから、IOポートの操作ができます。
 ただのリンクなので、HTMLでもjavascriptでも、アプリから操作OKです。 

posted by gpsnmeajp at 19:15| Comment(0) | TrackBack(0) | 未分類

2016年04月02日

秋月FlashAir DIP IOボード(AE-FAIO)の入出力テスター作った。

※テストじゃなくて、自作のHTMLやjavascriptからIOポートアクセスしたい人はこちら
 https://sites.google.com/site/gpsnmeajp/electricmemo/ae_faio_http_io

秋月FlashAir DIP IOボード(AE-FAIO)の入出力をテストするのって、
FlashAir以上に面倒です。(Luaスクリプトを書かなければならないため)

ので、FlashAirのcommand.cgiと同等のIOポート操作ができる"FAIOcommand.lua"と、
それを元に動く、GUI上でIOポート操作ができるIO_TEST_FAIO.htmを作りました。

FlashTools IO Testerと同じですが、それのcommand.cgiをFAIOcommand.luaに置き換えただけです。
無駄に5pin対応していますが、AE-FAIOには0-3ピンしか無いのでその点もご注意を。

この辺がgdgdなので、とりあえずアルファ版としてblog上公開にしておきます。



https://sites.google.com/site/gpsnmeajp/IO_TEST_FAIO.zip

不具合等ありましたらお知らせください。
(ページ下部のリンクが切れてるのは単に直してないだけです)
posted by gpsnmeajp at 15:14| Comment(0) | TrackBack(0) | 未分類

2016年04月01日

Windowsのログオン画面/ログオン認証を自分で作りたい/自分の作成した認証方式を使いたい場合に調べるキーワード

このへんの話、目的のキーワードにたどり着くまで非常に時間掛かったので、メモ。

WinXP
 GINA
 Graphical Identification and Authentication

Windowsの認証方法をオープン・ソースで代替してみよう 

WinVista以降
Credential Provider
Logon and Authentication Technologies: Logon and Authentication
https://technet.microsoft.com/en-us/library/cc780455(v=ws.10).aspx

カスタム Credential Provider の開発 https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2011/04/22/credential-provider-2/

カスタム Credential Provider で自動ログオンを行う方法 https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2011/08/17/credential-provider/

Vista/Winows7のログイン画面カスタマイズ
http://d.hatena.ne.jp/festiva1300/20091129/p1

デザイン至上主義プログラマー: 資格情報プロバイダーの話 http://komaoh.blogspot.com/2014/09/blog-post_8.html?spref=tw

IConnectableCredentialProviderCredential の利用 https://blogs.msdn.microsoft.com/japan_platform_sdkwindows_sdk_support_team_blog/2012/03/15/iconnectablecredentialprovidercredential/
posted by gpsnmeajp at 16:30| Comment(0) | TrackBack(0) | 未分類

2016年03月27日

Pebbleを使って78日目

今日初めて、バッテリー切れモードの画面を見ました。
私のPebble Timeの使い方だと、標準で5日くらい持つので、見るのが難しかったです。
Battery+を導入していると、残り1日や残り半日などで通知が来るので、
その時点で充電すれば良いので。

今回はあえて、電池消費の大きいアプリを動かし続けて見てみました。
これは、Bluetooth接続やアプリなどの機能を殺して、バックライトのみ動作するモードです。
この状態でさらに1週間持つとかいう話です。


Pebbleを使い始めてわかったのは、意識しないということです。

私は勤務中などは腕時計をしてますが、家に帰ると机の上に置くので、
その時に充電するくらいで、それ以外は至って普通に腕時計として機能しています。
防水だし。少し汚れたら洗います。指紋がつくと若干見にくいのは残念ですが、拭けばよし。

私の意識としても、腕時計です。本当に。カシオの腕時計を眺めているのとさほど変わらない。
意識を邪魔しないでくれます。電子ペーパー液晶のおかげで画面は常に表示されているし、
暗ければ腕を振ればバックライトを付けてくれます。ここもカシオの腕時計と何ら変わらない。

ただ、日常で一日に数回から十数回、スマートウォッチとして仕事してくれるときがあります。

・朝の天気予報のプッシュ通知を表示するとき
 (最近Yahoo天気の仕様が変わって、絵文字表示になったのが残念)
・ニュースを表示するとき


・メールやLINEが来た時


・リマインダーが起動した時
・サーバーからの通知を受け取った時

・Twitterで反応された時


・2段階認証するとき

・時間測りたい時

・カレンダー見たくなった時
・音楽を聞いている時(Bluetoothヘッドフォンをしている時、放送機材に接続している時などは特に)

・バッテリー残量が気になった時
・メトロノームが欲しくなった時

・月齢が知りたくなった時

・方位が知りたくなった時
 ・機内モードやマナーモードにしたくなった時

それ以外は、至って腕時計です。なにも邪魔しない。

睡眠中はPebble側で設定したおやすみモードが動作するので、通知はなりません。
画面に表示はされるけれど。
iPhoneのおやすみモードやマナーモードとは独立して動くのでそこは注意です。

当初は色々アプリを入れてましたが、3ボタンではできることに限りがあるし、
スマートフォンでやったほうがいいことも多い。
しかし、これらに関しては、腕時計でできると便利だったので、愛用しています。
特に通知に関しては効果絶大で、スマートフォンを取り出す回数は激減しました。

まあ、私が一番好みなのは、壁紙を好きなものにできて、
常時表示されているのでいつでも見れることですが。
二次元好きな方にはおすすめです。


posted by gpsnmeajp at 15:06| Comment(0) | TrackBack(0) | 未分類

2016年03月26日

FlashAirの開発ボード Airio や AirioRP 、秋月のボードがPC(Windows)で認識されない場合

Q. FlashAirの開発ボード Airio や AirioRP 、秋月のボードがPC(Windows)で認識されない

A. それらのボードについてるUSBポートは電源供給用です。
 PCに差し込めますが、5V取り出すだけで、認識されることは一切ありません。
 また、安全のため、モバイルバッテリーや、USB充電器、セルフパワードハブなど、
 PCや大切な機器以外で使用することをおすすめします。
posted by gpsnmeajp at 22:38| Comment(0) | TrackBack(0) | 未分類

2016年03月07日

まっさらなFlashAirをWi-Fi経由でupload.cgiを有効にするバッチファイル

これは、UPLOAD=1としなくても、WEBDAV=2の設定をすることで、
FlashAirにファイルをアップロードできてしまう仕様(公式サイトの記述とは合わないので
おそらくバグ)を利用したものです。

CONFIG.CGIからは、WEBDAVは設定できますが、UPLOADは設定できません。
しかしながら、WEBDAVで送り込んだLuaスクリプトを起動し、そのスクリプトによって
CONFIGを書き換えることは出来ますので、そのスクリプトからUPLOADやIFMODEなどを
書き換えることが出来ます。

そのため、以下の様なスクリプトによって、FlashAirに対してSDカード接続を一切無しで
Wi-Fiのみから、アップロード、最終的にはLua編集環境の導入(ページ下部のzip版)まで
出来てしまいます。

ただし、FlashAirを設定するためのマスターコードが必要なので、
この手法は、マスターコードが既知であるか、もしくは初期化直後で設定されていないFlashAirに対してしか使用できないため、
セキュリティ脆弱性となる可能性は低いと考えています。

---


以下のバッチファイルを実行します。
実行にはcurl.exeが必要です。

シェルスクリプトで実行すればmacやLinuxからでも可能だと思います

フォーマットされたFlashAirか、CONFIGを削除したFlashAir、
もしくはマスターコードをAA55AA55AA55にしたFlashAirが必要です。

---run.bat---
@echo off

echo FlashAirに接続せよ
pause

echo MASTERCODE...
curl "http://192.168.0.1/config.cgi?MASTERCODE=AA55AA55AA55"
echo.

echo WEBDAV...
curl "http://192.168.0.1/config.cgi?MASTERCODE=AA55AA55AA55&WEBDAV=2"
echo.

echo FlashAirを再起動し、再接続せよ
pause

echo UPLOAD SCRIPT...
curl http://192.168.0.1/run.lua -X PUT -d "f = io.open('SD_WLAN/CONFIG','a+');f:write('UPLOAD=1\r\n');f:close();print 'OK';"
echo.

timeout /T 3 >NUL

echo RUN SCRIPT...
curl "http://192.168.0.1/run.lua"
echo.

echo FlashAirを再起動し、再接続せよ
pause

explorer http://192.168.0.1/upload.cgi
pause


---

追記: curlのバイナリファイル送信機能を使って、FTLEをまとめたtarと、
 tar解凍Luaスクリプトを送り込んで実行させたら、Wi-FiのみでFTLEの環境準備ができました。
 FTLEには、各CONFIG書き換えセットアップ機能があるので、UPLOADやIFMODEも設定できますし、
 エディタ機能で書き換えもできます。

動作の保証はしません。curl.exeが必要です。
https://sites.google.com/site/gpsnmeajp/ONLYWiFiFTLE.zip
posted by gpsnmeajp at 22:32| Comment(0) | TrackBack(0) | 未分類

2016年01月30日

FlashAirとAE-FAIO_baseでIFTTTしてPebbleに通知。

余熱(@yone2_net)さんから、試作の基板を頂いたので。


ボタンと液晶、Groveコネクタ、そして電源用USB端子がついていて、
FlashAirで手軽に何かするには非常に便利な感じです。

プログラムは以下。
拙作のlibAE_FAIOを使っています。
液晶が3.3Vに接続されているので、lcdContが必須になります。

require("/FTLE/lib/libAE_FAIO-core");
require("/FTLE/lib/libAE_FAIO-gpio");
require("/FTLE/lib/libAE_FAIO-i2c");
require("/FTLE/lib/libAE_FAIO-lcd");

PIN_LED = 0;
PIN_SW1 = 1;
PIN_LCD = 2;
PIN_CN2 = 3;

libAE_FAIO_Setup(100);
pinMode(PIN_LED,OUTPUT);
pinMode(PIN_SW1,INPUT);
pinMode(PIN_LCD,OUTPUT);
pinMode(PIN_CN2,INPUT);

lcdInit();
lcdCont(0x20,1);
lcdMax(8,2);

::main::

lcdClear();
lcdPrintLine("STANDBY\nFlashAir");

digitalWrite(PIN_LCD,LOW);
while true do
    digitalWrite(PIN_LED,HIGH);
    delay(100);
    digitalWrite(PIN_LED,LOW);
    delay(100);
if(digitalRead(PIN_SW1)==LOW)then break;end;
end

digitalWrite(PIN_LCD,HIGH);
lcdClear();
lcdPrintLine("IFTTT\nSend...");
fa.request("https://maker.ifttt.com/trigger/***/with/key/***")

delay(500);

lcdClear();
lcdPrintLine("Notice\nSend OK!");

delay(10000);

goto main

※goto文使うもんじゃないですね、ええ。わかってます。
posted by gpsnmeajp at 20:47| Comment(0) | TrackBack(0) | 未分類