2015年03月25日

FlashAirで遊んだ記録

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

---
FlashAir III (W-03)で遊んだ結果をいろいろ追記していこうと思う。

1.自動起動スクリプトの注意点
FlashAirをアクセスポイントに接続するモードにした場合、接続までにそこそこ
時間がかかる。そのため、電源投入時に即LuaスクリプトからHttpアクセスしようとすると
たいてい失敗する。

30秒ほど待つとよい。


2.Luaスクリプトと無線スリープ
適当に、起動してから1秒置きに経過時間を書き込むLuaスクを書いてほっといたところ
いつまでも動作が続く。
無線LAN側から見えなくなっても続く。
タイムアウトに関係ないようだ。


3.ファイル破損
なにかを誤ったのか、ドライブが破損している的なメッセージをWindowsが発するようになった。
CHKDSKをしろと言われるが、過去の経験からあまりよろしくない。
特に大事なデータが入っているわけでもないのでフォーマットすることにした。

東芝ツールから初期化→ダメ (設定の初期化しかされない?)

松下SDフォーマッタからイレースフォーマット
↓(まっさらに)
東芝ツール起動
↓(ドライブ指定しろ→再度差し込め)
  どうやらCONFIGファイルを作成してバージョン情報を
  書き込ませている模様。
東芝ツールから初期化

退避しておいたCONFIGファイルをコピペ

で復旧した。


4.Pomera DM100の挙動
Windowsでは、Luaスクリプトから書き換えられたファイルをリアルタイムに見ることはできず、
差し直し(おそらく再マウントでよいと思うが)しなければならない。

しかし、Pomeraでは、Luaスクリプトから書き換えられたテキストを
開きなおすたびに最新の情報が表示される。

つまり、テキストWebブラウザくらいのことはできるということだ。

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

2015年03月18日

バックグラウンドでもFlashゲームを高速動作させる

最近刀剣乱舞をやっていて気が付いたが、タブの後ろや
ウィンドウの後ろにあるFlashは、バックグラウンド用に速度を抑えるようだ。

刀剣乱舞では、戦闘時の動作が明らかに遅くなる
(効果音の間隔が長くなる・索敵に時間がかかる、など)

これを回避する方法を見つけたので記しておく。
といっても、参考文献のそのままだが、一部パスが違うので記録しておく。

32bit版Windowsの場合、以下の場所にファイルを作成する。
(すでに存在する場合はそこに追記する。)
C:\windows\system32\macromed\flash\mms.cfg
メモ帳を『管理者権限で起動』するのが良い。

そして、最後の行に以下を追記する。
FullFramerateWhenInvisible=1

64bit版Windowsの場合、以下の場所にも同様に作成・追記する。
C:\windows\syswow64\macromed\flash\mms.cfg

GoogleChromeを使用している場合、以下の場所にも同様に作成・追記する。
C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default\Pepper Data\Shockwave Flash\System\mms.cfg
(Windows 8.1 Updateの場合のパスである。他のOSでは場所が変わる場合がある)

ちなみに、Systemフォルダ自体存在しないので、注意
つまり、
C:\Users\ユーザー名\AppData\Local\Google\Chrome\User Data\Default\Pepper Data\Shockwave Flash\
に移動後、Systemフォルダを作成し、mms.cfgを作成することになる。


参考文献
バックグラウンド再生でもFlashをすばやく動かす方法 

Windows/バックグラウンドのFlashの動作を止めない方法 - Yunacci-Wiki 
posted by gpsnmeajp at 14:49| Comment(0) | TrackBack(0) | 未分類

2015年03月09日

IchigoJamのIOポートに繋ぐと便利そうなもの

IchigoJamはまだ持っていないが、繋ぐと便利そうなものをリストアップしてみる
(=マイコンの心得がなくても使えそうなもの)

参考になれば

*PICアクチュエーター・キット: 組み立てキット 秋月電子通商 電子部品 ネット通販
指定した2つの角度にサーボモーターを動かすことができる。
2つのボタン操作の代わりに外部回路をつなぐことができる。
http://akizukidenshi.com/catalog/g/gK-01809/

*DRV8832使用DCモータードライブキット: 半導体 秋月電子通商 電子部品 ネット通販
モーターの制御ができる。
IN1,IN2の端子を操作することで、正転・逆転・停止ができる。
速度変更はボリュームで。
http://akizukidenshi.com/catalog/g/gK-06497/

*高精度IC温度センサ LM35DZ: センサ一般 秋月電子通商 電子部品 ネット通販
アナログ入力端子を使って温度が測れる
http://akizukidenshi.com/catalog/g/gI-00116/

*5ポジションスイッチ・モジュール #27801: パーツ一般 秋月電子通商 電子部品 ネット通販
プルアップ済み。入力端子につないでゲーム機みたいに。
http://akizukidenshi.com/catalog/g/gM-06808/

*大電流大型リレーモジュールキット: パーツ一般 秋月電子通商 電子部品 ネット通販
蛍光灯とか、モーターとか、とりあえずON-OFF制御したいときに
http://akizukidenshi.com/catalog/g/gK-06095/

*ZigBeeワイヤレスモジュール TWE−Lite Dip−WA (半完成品セミキット): 無線、高周波関連商品 秋月電子通商 電子部品 ネット通販
とりあえずデジタルIO入出力を無線化できる。
http://akizukidenshi.com/catalog/g/gK-06759/

*光センサースイッチキット: 組み立てキット 秋月電子通商 電子部品 ネット通販
明るいか暗いかをON-OFFで知ることができる
(個人的には、CdSと抵抗を用いて分圧し、アナログ入力につなぐのをお勧めするが、
 アナログ入力がふさがっているときなど)
http://akizukidenshi.com/catalog/g/gK-06623/

*PICマイコン赤外線リモコン学習キット: 組み立てキット 秋月電子通商 電子部品 ネット通販
スイッチ入力をトランジスタで置き換えてあげれば、
リモコン操作がBASICからできるようになる。
http://akizukidenshi.com/catalog/g/gK-04174/

*音声合成LSI - AquesTalk pico LSI
あらかじめ書き込んでおいた言葉を4bitのスイッチ入力で発声するモードがあるので
それを使えば15種類の声をIchigojamから鳴らせる
(ただし、書き込みにはPCとUSB-UART変換アダプタが必要。)
http://www.a-quest.com/products/aquestalkpicolsi.html
posted by gpsnmeajp at 20:33| Comment(0) | TrackBack(0) | 未分類

2015年03月07日

マイコン(Arduino等)とMindstorms NXT/EV3をI2Cで繋ぐ(プログラム)

デバイスに依存する一部の記述を書き換えれば、
たいていの環境で利用できるよう、1から書き直しました。
松原拓也様のNicosensorを参考にさせて頂いています。
#define scl0     10
#define sda0 9
#define ACK 0
#define NAK 1
#define WRITE 0
#define READ 1

#define SDA_OPEN 1
#define SDA_LOW 0
#define SCL_OPEN 1
#define SCL_LOW 0


void setup()
{
main0();
}
void loop()
{}


//---デバイス依存部---
void iic_ports_low()
{
digitalWrite(scl0,LOW);
digitalWrite(sda0,LOW);
}

void set_scl(char t)
{
if(t==SCL_LOW)
pinMode(scl0,OUTPUT);//Low
else
pinMode(scl0,INPUT);//Hi-Z

return;
}
void set_sda(char t)
{
if(t==SDA_LOW)
pinMode(sda0,OUTPUT);//Low
else
pinMode(sda0,INPUT);//Hi-Z

return;
}
char get_scl()
{
return digitalRead(scl0);
}
char get_sda()
{
return digitalRead(sda0);
}
//--------------------------

void iic_bus_open()
{
iic_ports_low();
set_scl(SCL_OPEN);set_sda(SDA_OPEN);
}
void iic_wait_scl(unsigned char b_scl)
{
while(!(get_scl() == b_scl));
}

void iic_wait_bus(unsigned char b_sda,unsigned char b_scl)
{
while(!(get_sda() == b_dsa && get_scl() == b_scl));
}


void iic_start()
{
iic_bus_open();
iic_wait_bus(SDA_OPEN,SCL_OPEN);
iic_wait_bus(SDA_LOW ,SCL_OPEN);
iic_wait_bus(SDA_LOW ,SCL_LOW);
}

void iic_stop()
{
iic_bus_open();
iic_wait_bus(SDA_OPEN,SCL_OPEN);
}

void iic_set_ack(char ack_or_nak)
{
//0=ack, 1=nak
set_sda(ack_or_nak);
iic_wait_scl(SCL_OPEN);
iic_wait_scl(SCL_LOW);
}

unsigned char iic_write(unsigned char d)
{
int i;
int ack = 0;
for(i=0;i<8;i++)
{
if((d & 0x80) != 0)
set_sda(SDA_OPEN);
else
set_sda(SDA_LOW);

d<<=1;
iic_wait_scl(SCL_OPEN);
iic_wait_scl(SCL_LOW);
}
//--
//0=ack, 1=nak

set_sda(SDA_OPEN);
iic_wait_scl(SCL_OPEN);

if(get_sda() != 0)
ack = 1;

iic_wait_scl(SCL_LOW);

return ack;
}
unsigned char iic_read()
{
int i;
unsigned char d = 0;

for(i=0;i<8;i++)
{
d<<=1;

iic_wait_scl(SCL_OPEN);

if(get_sda() != 0)
d |= 1;

iic_wait_scl(SCL_LOW);
}
return d;
}

//アドレスだけほしい時
unsigned char iic_start_and_wait()
{
iic_start();
return iic_read();
}

//1つのアドレスのみ反応したいとき
void iic_start_and_wait_for_me(unsigned char adr,char mode)
{
//0=write 1=read
unsigned char radr = 0;
unsigned char cadr = ((adr << 1) & 0xFE)|mode;
while(1){
radr = iic_start_and_wait();

if(radr == cadr)
break;

iic_set_ack(NAK);
}

iic_set_ack(ACK);
return;
}


#define MODE_NXT_READ_NON_REG 0
#define MODE_NXT_READ_REG 1

#define MODE_NXT_WRITE_NON_REG 2
#define MODE_NXT_WRITE_REG 3

#define MODE_EV3_1_BYTE_WRITE 4
#define MODE_EV3_1_BYTE_READ 5

#define MODE_EV3_8_BYTE_WRITE 6
#define MODE_EV3_8_BYTE_READ 7

void main0()
{
int c,ack;
unsigned char reg=0,reg_ary[8]={0},val=0,val_ary[8]={0};
iic_bus_open();
delay(100);


mode = x;

while(1)
{
switch(mode)
case MODE_NXT_READ_NON_REG:
iic_start_and_wait_for_me(0x01,WRITE);

iic_start_and_wait(0x01,READ);
ack = iic_write(val);

iic_stop();
break;
case MODE_NXT_READ_REG:
iic_start_and_wait_for_me(0x01,WRITE);

reg=iic_read();
iic_set_ack(ACK);

iic_start_and_wait(0x01,READ);
ack = iic_write(val);

iic_stop();
break;
case MODE_NXT_WRITE_NON_REG:
iic_start_and_wait_for_me(0x01,WRITE);

val=iic_read();
iic_set_ack(ACK);

iic_stop();
break;
case MODE_NXT_WRITE_REG:
iic_start_and_wait_for_me(0x01,WRITE);

reg=iic_read();
iic_set_ack(ACK);
val=iic_read();
iic_set_ack(ACK);

iic_stop();
break;

case MODE_EV3_1_BYTE_READ:
iic_start_and_wait(0x01,READ);
ack = iic_write(val);

iic_stop();
break;
case MODE_EV3_1_BYTE_WRITE:
iic_start_and_wait_for_me(0x01,WRITE);

val=iic_read();
iic_set_ack(ACK);

iic_stop();
break;
case MODE_EV3_8_BYTE_READ:
iic_start_and_wait(0x01,READ);
for(i=0;i<8;i++)
ack = iic_write(val[i]);
iic_stop();
break;
case MODE_EV3_8_BYTE_WRITE:
iic_start_and_wait(0x01,READ);
for(i=0;i<8;i++)
{
reg[i]=iic_read();
iic_set_ack(ACK);
}
iic_stop();
break;

iic_start_and_wait_for_me(0x01,WRITE);
c=iic_read();
iic_set_ack(ACK);
// iic_set_ack(NAK);

// iic_start_and_wait(0x01,READ);
iic_start();
iic_read();
iic_set_ack(ACK);
ack = iic_write(5);
iic_stop();
}

}


void NXT_EV3_1BYTE_READ() //NXT=RegありREAD,EV3=1byteREAD
{
int c,ack,adr;
unsigned char val=0;
iic_bus_open();
delay(100);

while(1)
{
adr = iic_start_and_wait();

if(adr == 0x01|READ)
{
iic_set_ack(ACK);

ack = iic_write(val);
iic_stop();
}else if(adr == 0x01|WRITE)
{
iic_set_ack(ACK);

iic_read();
iic_set_ack(ACK);
}else{
iic_set_ack(NAK);
}
}
}
posted by gpsnmeajp at 19:30| Comment(0) | TrackBack(0) | 未分類

2015年03月06日

マイコン(Arduino等)とMindstorms NXT/EV3をI2Cで繋ぐ

マイコンをセンサーとしてMindstorms NXT/EV3を繋ぐ方法について記す。 英語/日本語の資料をバタバタと行き来して大変だったため。 1.接続方法(物理層)マイコンとMindstorms を接続する方法は、NXTでは3つ、EV3では6つある。 ・Bluetooth ・アナログ ・I2C ・UART (EV3のみ) ・LAN (EV3のみ) ・USB (EV3のみ) このうち、LAN・Bluetoothはセンサーではなく、ホストとしての接続となる。 USBはEV3をツリー接続できることから可能だろうと考えられるが、現状難しいと思われる。 UARTは、シリアルコンソールか、センサーの2種類があるが、 仕様をよく調査できなかったため、扱わない。 アナログ入力については、他の人の情報を参照してほしい。 ここでは、情報の多いI2C接続を用いる。 I2C接続は、公式にはNXTの超音波距離センサーにのみ使われている。 (他サードパーティのセンサーの多くはI2Cを使っている) EV3の超音波距離センサーはUART接続だ。 I2Cは、センサー入力の変形RJ12端子の、端の2ピンに出ている。 5pinにSCL、6pinにSDAが出ている。 この特殊コネクタは通常には手に入らない。 mindsensors社がほぼ唯一取り扱っており、この中では I2C Host Cable with NXT Connector http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=136 がケーブル付きで使いやすい。(ピンの解説もここでしている) プラグのみ販売もしれいるが、圧着工具が特殊になる(市販の工具を改造して用いる必要がある)ので注意。 日本ではROBO Product社が扱っている。 http://roboproduct.com/MS02NXTAccessories.htmlわかりにくいが、2本1セットで525円である。 ちなみに、送料が1180円と高いので注意。買うなら多めに。 2.接続方法(回路・ソフトウェア)最初は超音波距離センサー(Ultrasonic distance sensor)として接続するのをおすすめする。 超音波センサーであれば、容易にテストが可能だからだ。 I2C機器を直接扱う追加ブロックもあるが、後述する。 接続回路および、プログラムは、松原拓也のNicoSensorがわかりやすい。 I2Cスレーブをソフトウェアで実装しているため、安価な少ピンマイコンを使うことができる。 http://nicotak.com/robot/nxt/ Arduinoを用いる場合、相応のライブラリが公開されているようなので、そちらを用いるといいだろう。 通信プロトコルは、 LEGO MINDSTORMS NXT Ultrasonic Sensor I2C Communication Protocol で検索すればPDFファイルで出てくるが、少なくともNXTでは NicoSensorのように0x42命令にだけ対応していれば問題なく通信できる。

I2Cのクロック速度は10kHz以下と低速で、故にソフトウェアでも処理できる。
ただし、BrickPiなどは100kbpsで通信しようとするため、使用できない可能性がある。注意。

追記
自分の試した限り、NXTでは超音波距離センサーとして接続できたが
EV3では接続できなかった。接続開始時になにやら送信されているのが確認されたため、
これを解析すれば問題なく動くようにできるだろうが、
下記のカスタムブロックでは問題なく通信できているため、詳しくは調べていない。
3.周期などMindstorm NXTで確認した感じだと、センサー入力で待機、 もしくはループの条件をセンサーにした場合、通信を含め47ms周期で取得が行われた。 通信のタイミングは、センサーの命令が発生した時である。 通信から次の通信までは43msである。 つまり、最高速でも40msの処理時間があり、さらにNXT側のプログラムで ウェイトを入れてあげれば、より処理時間が確保できる。 (実際1secのウェイトを入れると1040msほどになった)

追記
上記の結果は純正超音波距離センサーとしてつないだ場合で、
下記のカスタムブロックを用いると、NXT/EV3共に、10ms以下で取得ループが発生する。

NXTの場合、通信以外の余地は1msしか存在しなかった。

4.任意の通信をするC言語などを使えば任意の通信が可能なのは調べれば容易に出てくるが、 ブロックプログラミング(NXT-G等)を使って、任意のI2C機器と通信するにはどうするか。 以下の追加ブロックを使用すれば可能である。 EV3の場合、Dexter Industries EV3 SensorsのI2C communication blockを使う。 https://github.com/DexterInd/EV3_Dexter_Industries_Sensors ページ下部に書いてあるとおり、Dexter.ev3bをダウンロードし、インポート EV3ソフトウェアからインポートしてあげれば良い。 ※EV3ソフトウェアからNXTをプログラミングするときには使用できない (Program.ev3pが見つからないと表示される) 使い方は以下がいい。 http://www.dexterindustries.com/howto/connecting-ev3-arduino/ NXTの場合、Mindsensor社のIIC_Read.zip、IIC_Write.zipを用いる。 http://www.mindsensors.com/index.php?module=documents&JAS_DocumentManager_op=categories&category=12 解凍し、NXTソフトウェアから解凍したフォルダ内を指定してあげると、インポート項目に現れる。 (導入方法) http://www.mindsensors.com/index.php?module=pagemaster&PAGE_user_op=view_page&PAGE_id=81 5.各ブロックの使い方I2CReadは次のように使う WriteRegを無効にした状態だと、下のようなプログラムで送信できる。 waitForMe(MYSLA); //(スタートビット&自分のアドレスまで待機) i2c_start(); //送受信切替 i2c_read_byte(); //Writeフラグのたったアドレスを破棄 i2c_write_ack(); // ACK送信 i2c_write_byte(val); // 値送信 i2c_get_ack(); i2c_stop(); WriteRegを有効にした状態だと、レジスタ、つまりアドレス指定ができるようになる。 実質的に1バイトのデータを送った返事として受け取るような形となる。 下のようなプログラムで送受信できる。 waitForMe(MYSLA); //(スタートビット&自分のアドレスまで待機) reg = i2c_read_byte(); //レジスタ受信 i2c_write_ack(); // ACK送信 i2c_start(); //送受信切替 i2c_read_byte(); //Writeフラグのたったアドレスを破棄 i2c_write_ack(); // ACK送信 i2c_write_byte(val); // 値送信 i2c_get_ack(); i2c_stop(); I2CWriteは次のように使う WriteRegを無効にした状態だと、下のようなプログラムで受信できる。 waitForMe(MYSLA); //(スタートビット&自分のアドレスまで待機) val = i2c_read_byte(); //値受信 i2c_write_ack(); // ACK送信 i2c_stop(); WriteRegを有効にした状態だと、レジスタ、つまりアドレス指定ができるようになる。 実質的に2バイトのデータを送ような形となる。 waitForMe(MYSLA); //(スタートビット&自分のアドレスまで待機) reg = i2c_read_byte(); //レジスタ受信 i2c_write_ack(); // ACK送信 val = i2c_read_byte(); //値受信 i2c_write_ack(); // ACK送信 i2c_stop(); ちなみにwaitForMeの中身を以下に示す。 Nicosensorのソースを切り出したそのままなので、そちらを参照していただきたい。 void waitForMe(unsigned char myadr) { unsigned char slaw=0; while(1){ i2c_start(); // 1.マスタからの接続待ち slaw = i2c_read_byte(); // 2.アドレス受信 if (slaw == myadr) { // アドレスが一致の場合、 i2c_write_ack(); // ACK送信 break; } else { // アドレスが不一致の場合、 i2c_write_nack(); // NACK送信 } } }
---

追記
EV3のDexterの場合、挙動が異なる。
アドレスの指定の仕方は7bitで、各ブロックで勝手にRead/Writeビットをセットしてくれる。
1を指定すると、書き込みは0x02、読み込みは0x03になる。

MindsensorのIIC_Read、IIC_Writeの場合、アドレス指定は8bitで行う。
こちらもRead/Writeビットをセットしてくれる。
2を指定すると、書き込みは0x02、読み込みは0x03になる。

が、このセットの仕方がORではなく+1のため、
例えば読み込みなのに1を指定すると、書き込みは0x01、読み込みは0x02とおかしなことになる。

また、読み込みに入るタイミングなどが違うので
各挙動については以下の図を参照してほしい。


追記
EV3のブロックのdigitalWriteは、I2CWriteのWriteRegを有効にした状態、
EV3のブロックのdigitalReadは、I2CReadのWriteRegを有効にした状態と等価に動く。

また、一部のI2C機器はEV3ではアナログセンサーと認識し、初回接続時動作しないことがある。
プログラム実行中に抜き差しするとEV3がI2C機器として認識しなおすため、動作するようになる。

TETRIXのDC Motor装置をEV3のブロックで動かすことができたので記録。


---
Arduinoで動作確認して、PICに移植している。 Arduinoでのソースがほしい方が居たら、お渡しできるので連絡してほしい。 以上、参考になれば嬉しい。 なにか追加の情報を持っている方が居たら、twitterまで知らせてほしい。
---



--- 関係ないが、GoogleDocsで編集したものを画像込みで コピペしたら、画像ごと貼り付けられた。下書きにはGoogleDocsが便利なようだ。 ただ、フォントが違うのがいただけない。

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

2015年03月03日

Windowsの画面の明るさを変えるバッチファイル

現在アクティブな電源プロファイルのGUIDを自動で取得するようにしました。
自分の使ってみた感じだと、複数のプロファイルを切り替えても動きました。
AC、DCの両方をセットするので、電源接続時でもバッテリー状態でも動きます。

D:\LIGHT_SET 10
とかいう感じで使ってみてください

---LIGHT_SET.bat---

@echo off

IF "%1"=="" (
SET /P LIGHT_LEVEL="明るさを入力してください(0〜100)"
) ELSE (
SET LIGHT_LEVEL=%1
)

SET /A LIGHT_LEVEL=%LIGHT_LEVEL%
REM 数値かチェック(数値でなければ0になる)
REM 異常値チェックをしていないが、powercfg側が弾いてくれる。

REM 現在アクティブな電源プロファイルのGUIDを取得
FOR /f "DELIMS=" %%A IN ('Powercfg -getactivescheme') DO SET RAW_GUID=%%A
SET GUID=%RAW_GUID:~12,36%
ECHO GUID:%GUID%

powercfg -setACvalueindex %GUID% 7516b95f-f776-4464-8c53-06167f40cc99 aded5e82-b909-4619-9949-f5d71dac0bcb %LIGHT_LEVEL%
powercfg -setDCvalueindex %GUID% 7516b95f-f776-4464-8c53-06167f40cc99 aded5e82-b909-4619-9949-f5d71dac0bcb %LIGHT_LEVEL%
powercfg -setactive %GUID%

ECHO 明るさを%LIGHT_LEVEL%に設定した

EXIT /B 0

---
posted by gpsnmeajp at 00:07| Comment(1) | TrackBack(0) | 未分類

2015年03月02日

Windowsの画面の明るさをコマンドラインからいじる

Windows Vista以降から標準で搭載されたっぽい画面の明るさ制御を
コマンドからやる方法ってどうやるだろう、と調べたら
ばっちり書いてくれている人が居た。

Win32APIで画面の明るさを変更する方法 - Kerosoft : Modus Operandi http://mo.kerosoft.com/0192

1. Powercfg -getactivescheme でアクティブな電源管理のプロファイルIDを調べる。

自分の場合は以下のように表示された。
電源設定の GUID: 381b4222-f694-41f0-9685-ff5bb260df2e  (バランス)

PCごとに違う。注意。
また、多分1回調べれば、プロファイルを作りなおさない限り変わらない。
このPCの場合は381b4222-f694-41f0-9685-ff5bb260df2e


2.
powercfg -setACvalueindex <プロファイルID> 7516b95f-f776-4464-8c53-06167f40cc99 aded5e82-b909-4619-9949-f5d71dac0bcb <明るさ(0〜100)>
powercfg -setDCvalueindex <プロファイルID> 7516b95f-f776-4464-8c53-06167f40cc99 aded5e82-b909-4619-9949-f5d71dac0bcb <明るさ(0〜100)>

を実行した上で

powercfg -setactive <プロファイルID>

を実行する。
設定を変更して、適用するのと同じだ。

ACの方は電源接続時、DCのほうがバッテリー時である。
両方同じにする必要はないし、必要な方だけ設定すれば良い。


バッチファイルやタイマーから操作するときはこれでいいと思う。
プログラムからはWindows APIを使ったほうが良い。
posted by gpsnmeajp at 23:24| Comment(0) | TrackBack(0) | 未分類

今日の教訓

教訓: PICのPORTxレジスタのBSF,BCF問題はC言語でも変わらず生きている。
    入力ピンを念のため初期化するなら、一括で設定するか、別途変数を作る。

ちょっとわけあってこんなプログラムをPICのX8Cで組んでいました
PICを触るのはまた久しぶり、しかも短時間だからどんどん忘れている。

void digitalWrite(int p,int x)
{
    if(p == sda0)
    {
        RB4 = x;
    }else if(p == scl0){
        RB5 = x;
    }
}

void I2C_START_()
{
   digitalWrite(sda0,LOW);
   digitalWrite(scl0,LOW);

   pinMode(scl0,INPUT);

   ...

}


そうです、下にArduinoで組んだI2Cマスタをそのまま移植しています。
ここで問題、このプログラムは正常に動作するでしょうか?

解:しない

どういう挙動になるか?

*理想
RB4=0 でポートB4が LOWに。
RB5=0 でポートB5が LOWに。

ポートは入力に設定されているので、直ぐに出力には影響しないが
ポートを入力にするとHi-Z、出力にするとLowになる。

*現実
RB4=0 でポートB4が LOWに。
出力・入力レジスタが共有で、BCFで書き換わるため
読み出し→書き換え→書き込みが行われるため、プルアップされているRB5がHIGHに

RB5=0 でポートB5が LOWに。
出力・入力レジスタが共有で、BCFで書き換わるため
読み出し→書き換え→書き込みが行われるため、プルアップされているRB4がHIGHに

ポートは入力に設定されているので、直ぐに出力には影響しないが
ポートを入力にするとRB4、RB5ともにHi-Z

出力にするとRB4がHigh、RB5がLowになる。


そりゃうまく動かないわけだ。

しかも、お陰で3.3Vで動いているLCDの入力ピンに5Vを掛けたことに。
とりあえず、時間が短かったせいか壊れてはいないようです。

*解決方法
void digitalWrite(int p,int x)
{
   PORTB=0; //他なにもつながってないし
}

AVRでは入出力のレジスタが分かれているので起こらないし。
新しい品番のPICではLATxという出力専用レジスタがあるのでやっぱり起こらない。

結局これに5時間くらい悩まされて頭が痛くなった。
やっぱりくせがあるぜ8bitのPIC...


*おまけ

39:            void digitalWrite(int p,int x)
40:            {
41:                if(p == sda0)
0535  0870     MOVF __pcstackCOMMON, W
0536  0471     IORWF 0x71, W
0537  1D03     BTFSS STATUS, 0x2
0538  2D43     GOTO 0x543
42:                {
43:                    RB4 = x;
0539  1C72     BTFSS x, 0x0
053A  2D3F     GOTO 0x53F
053B  1283     BCF STATUS, 0x5
053C  1303     BCF STATUS, 0x6
053D  1606     BSF PORTB, 0x4
053E  0008     RETURN
053F  1283     BCF STATUS, 0x5
0540  1303     BCF STATUS, 0x6
0541  1206     BCF PORTB, 0x4
44:                }else if(p == scl0){
0542  0008     RETURN
0543  0370     DECF __pcstackCOMMON, W
0544  0471     IORWF 0x71, W
0545  1D03     BTFSS STATUS, 0x2
0546  0008     RETURN
45:                    RB5 = x;
0547  1C72     BTFSS x, 0x0
0548  2D4D     GOTO 0x54D
0549  1283     BCF STATUS, 0x5
054A  1303     BCF STATUS, 0x6
054B  1686     BSF PORTB, 0x5
054C  0008     RETURN
054D  1283     BCF STATUS, 0x5
054E  1303     BCF STATUS, 0x6
054F  1286     BCF PORTB, 0x5
46:                }
0550  0008     RETURN
47:            }

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

2015年03月01日

秋月のI2C-LCDを、Arduinoのライブラリを使わずにソフトウェアI2Cマスタから操作するコード

散々皆さん書かれてるでしょうが、必要とする人もいるかもと思い書いておきます。
秋月のI2C-LCDを、Arduinoのライブラリを使わずにソフトウェアI2Cマスタから操作するコード
とある装置のデバッグ用に書いたので、液晶を操作するのであればこんなものを使わずにライブラリを使ったほうがいいです。
posted by gpsnmeajp at 16:14| Comment(0) | TrackBack(0) | 未分類

2015年02月21日

debianにarduino開発環境を入れる

debianにarduinoを入れる。

まずapt-getで入れて、その後、公式からダウンロード、
kdesu dolphinで/usr/share/arduino/にコピー(上書き)。

その後、エディタの汚いのを以下に合わせて修正。

Arduino IDE のインストールと使い方 (Linux編):息子と一緒に Makers:So-netブログ http://makers-with-myson.blog.so-net.ne.jp/2013-10-27 


kdesuが使えない問題は、以下のページを参考に。

Debian User Forums • View topic - HOWTO - get kdesu back to normal in KDE4 

色々書いているが、

su
ln -s /usr/lib/kde4/libexec/kdesu /usr/bin/kdesu
exit

でOK。
posted by gpsnmeajp at 16:03| Comment(0) | TrackBack(0) | 未分類

Linuxでフレームバッファで遊ぶ:準備

ここを見て、フレームバッファで遊びたくなった。

フレームバッファ動作
http://okgnz.web.fc2.com/catf/catf5.htm


昔電子工作でNokiaのカラー液晶を扱ったことがあるが、
そんな感じで生でディスプレイを扱う感じが面白そうだと思った。

Raspberry Piでカラー液晶に画面を出したり、スクリーンショットを取るのにも
ここにアクセスするようだ。

で、これを有効にするのに、ネットを駆けずり回って、とりあえず画像表示できるようになったので
メモしておく。

動作確認には、ここで紹介されているfbiという画像ビュアーを使った

fbiでフレームバッファ上に画像を表示する: 日々のーと
http://snowfly.air-nifty.com/wiz/2010/05/fbi-60df.html

試しに入れてみるも、実行後、"フレームバッファが開けない"と弾かれる。


ここを参考にデバイスファイルを手動で作ってみる。

Framebuffer HOWTO: インテルプラットホーム上でフレームバッファデバイスを使う ftp://ftp.rackspace.com/pub/linux/redhat/7.2/doc/HOWTOS/translations/ja/html/Framebuffer-HOWTO/Framebuffer-HOWTO-5.html

しかしダメ。

結局、そもそもフレームバッファが有効でなかったらしく、ブートオプションを編集。
Linux/VESA フレームバッファを有効にする方法 - とある技術の私書目録 http://seesaawiki.jp/w/renkin3q/d/Linux/VESA%20%A5%D5%A5%EC%A1%BC%A5%E0%A5%D0%A5%C3%A5%D5%A5%A1%A4%F2%CD%AD%B8%FA%A4%CB%A4%B9%A4%EB%CA%FD%CB%A1

これで使えるようになった。


ただ、まだC言語からのアクセスには失敗する。
posted by gpsnmeajp at 00:16| Comment(0) | TrackBack(0) | 未分類

2015年02月17日

仮想マシン導入

7年前のおんぼろノートPCを、ゲーミングノートに買い替えたので
ここぞとばかりにいろいろ導入している。

VirtualBoxにdebianを導入して、SSHで接続できるようにした。

という、メモです。生存報告ともいう。

しかし、CPU仮想化支援やマルチコアのおかげか、
以前のように仮想マシンを動かしていると重くてしょうがない、ということがなくて
快適だ。

---

debianに入れたGeanyの実行機能がうまく動かない問題に遭遇。
実行してもGeanyの作るrunスクリプトに制御が移らず、単にホームディレクトリが開く。

設定から端末の設定を以下にすることで解決した。
端末:konsole --workdir . -e sh geany_run_script.sh

参考
Geany FAQ(日本語) http://1204lts.blogspot.jp/2013/01/geany-faq.html

---

Chromeの文字化けはコレで解決
【Xubuntu】chrome/chromiumのタイトルやら、メニューが文字化けたときの対応方法 | ざかしんく
http://zaka-think.com/linux/xubuntu/xubuntu-chrome-text-garble/

KDEの日本語化はこっち。
language-pack-kde-jaではできなかった。

Luaのお勉強 コメントの書き方やデータ型 - Symfoware
http://symfoware.blog68.fc2.com/blog-entry-446.html
posted by gpsnmeajp at 12:46| Comment(0) | TrackBack(0) | 未分類

2015年01月31日

ネットに繋がっておらずwi-fiも利用できない、iTunesやテザリングドライバも入っていないPCに、Zipファイルをダウンロードする方法。

ネットに繋がっておらずwi-fiも利用できない、iTunesやテザリングドライバも入っていないPCに、Zipファイルをダウンロードする方法。

・Android
1.ブラウザでファイルをダウンロードする
2.USBケーブルでつなぐ
3.マスストレージモードで認識させる
4.ファイルを取り出す

iPhone
1.ブラウザでファイルのあるところまで行く
2.ブラウザではダウンロードが出来ないので、ファイルのURLをコピーする
3.GoodReaderを開き、URLからダウンロードする
4.Open in... で、iStickアプリにコピーする
5.iStickをiPhoneにつなぐ
6.iStickアプリからiStickにコピーする
7.iStickを取り外す
8.iStickをPCに繋ぎ、ファイルを取り出す

手間もオプションもかかるけど、出来なくは無い。

※0 どんな状況だよ: 未だに動いてるWinXP(LANから遮断されている)にツールを入れるときとか。

※1 iStick : LightningとUSBの両端子がついたUSBメモリ。専用アプリからファイルの読み書きができる。
  IO-DATAとPQIから出ているが、両方同じものの輸入品。個人的にはIO-DATAがオススメ。
  今度、SanDiskからiXpandフラッシュドライブ似たようなものが出るようだ。
  アプリの出来を見るに、SanDiskのそっちの方がオススメっぽい。

※2 iPhoneは、ドライバ無しでUSBにつないでも写真は取り込める。写真しか取り込めない。
   カメラコミュニケーションキットという、USBやSDカードが読み書きできそうなアダプタも公式にあるが
   それも写真の取り込みしか対応していない。
   (非公式に、キーボードやUSB-MIDI、USB-DACなんか繋がったりするが。)

※3 GoodReaderはWi-Fiファイル共有機能や、USB転送機能があるので、ドライバか、iTunesか
   もしくはネットなしでもWi-Fi接続ができればファイルは送り込める。
   でも、それならテザリングでネットに繋いだほうが早い。

結論。
Androidは簡単便利。
iPhoneは色々面倒だが、オプション等組み合わせればできなくはない。
posted by gpsnmeajp at 00:48| Comment(0) | TrackBack(0) | 未分類

2015年01月04日

ExplorerKiller

Windows8.1にしてから、Explorerがものすごい勢いでバグる。

どうバグるかというと、
・タスクバーが操作できなくなる
・壁紙が黒になる
・アイコンが重複表示され始める(しかもカーソル合わせる度に変化する)
・Metroに行ったらオシマイ。タイルはクリックすると消え起動せず、デスクトップにも戻れず、
 タスクマネージャも起動しない。(おそらく動いてはいるが常に手前に表示していないが故に
 前面に出てこない)Ctrl+Alt+Deleteは効くが、サインアウトしかない
 追記: このツールで脱出に成功した!ただし、Metroで終了すると復帰後もMetroに戻る。
     一旦デスクトップに戻ってからMetroに移行するので、再度ハングしたかと勘違いしやすい

もう嫌気が差したので、LinuxでXWindowをCtrl+Alt+BackSpaceで強制終了できるように
同じくできないかと考え、作りました。

お悩みの方はどうぞ。
おまけで、任意のバッチファイルを起動する機能もつけてあります。
そっちは、PCのスリープ解除時に無線LANに接続できない不具合があるので、その対策につけたものです。

こちらからどうぞ
https://sites.google.com/site/gpsnmeajp/tools/e
posted by gpsnmeajp at 16:57| Comment(0) | TrackBack(0) | 未分類

2014年12月18日

Chromeを使った提携アプリ解除

RT・アカウント乗っ取り型スパムのiPhoneからの駆除方法(iOS7・8両対応)

「面白い情報」やら「拡散希望」やらでURLを踏ませ
アカウントに寄生して勝手に広告しまくる嫌がらせ
解除する手順を以下に示します。


twitterは、iOSなどからアクセスするとモバイル版サイトに飛ばされます。
モバイル版はapplication扱いなので、そこからアプリ提携は解除できません(セキュリティ上の理由)

Google Chromeアプリを利用した提携解除手順を解説します。

判る人向け:UA偽装によるPC版twitterへのアクセス手順
        iOS8の場合はSafariで出来ます。

わからない人向け

1.アプリストアからChromeをダウンロードします。

ここをタップでアプリストアへ行けます。





2.インストールが完了するまで待ちます。

3.インストールができたら起動しましょう

4.歓迎されるので同意して続行をタップ


5.利用説明です。左にスワイプして進む

6.今回はログインは不要です。(Chromeがお気に召したらどうぞ)

8.文字書くの面倒になったので画像の中に文字入れました。














お疲れ様でした。

数日様子を見て、勝手なRTなどが無いか確認して下さい。
Chromeを削除しても構いません。


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

2014年11月22日

16F1705

若干間違えた使い方をしながら、16F1705を試食中。
32MHzでの内蔵クロックと、UARTとADCをとりあえず使えるようにした段階。

UARTのピンが自由に割り当てられてびっくりしました。
dsPICだと普通だったけども。


コメントが文字化けしてますが、これはちょっとどうしようもない(閉じてから気付き全ロスト)
posted by gpsnmeajp at 14:11| Comment(0) | TrackBack(0) | 未分類

さっそくPickit3にハマる

最近のPIC(16F 4桁系)は、新しい機能が色々ついていますね。
PLLで32MHzで駆動したりとか、WDTがプログラムから制御できたりとか
入出力の切り替えをロックできたりとか。

それはさておき、先日Pickit3を買い、使おうとしたら早速ハマり掛けたので報告。

噂には聞いていましたが、未だにこうだとは思いませんでした。


現象は簡単。MPLAB IPEでもMPLAB XでもPickit3に接続できないというもの。
シリアルナンバー自体は表示されるのに、Connection Failed. と言われます。

知恵袋の回答(というか質問者の返答)を参考に解決。

PICkit3とパソコンの接続がうまくいきません。ノートパソコンwindows8.1... - Yahoo!知恵袋 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11133085266

※旧MPLABで認識させ、書き換えてからMPLAB Xで接続する、という手法もあるようです。

質問者の返答の通り、
1.Pickit3を一旦抜き
2.Pickit3本体のボタンを押しながら接続
3.ボタンを離すとPCが認識するので、押せるようになり次第
 即座にMPLAB IPEのConnectボタンをクリック。

うまくいくと、上のログのようにファームウェアの更新が始まります。
多分リカバリーモード的な何かなのでしょう。

タイミングがシビアっぽいです。
2回ほどうまく行かなかったので怪しみましたが、3回目で成功しました。

一度書き換わると以後、MPLABでも問題なく通信できます。

多分、MPLAB IPEでのConnectを、MPLAB XでのWriteにしても、同様に修復可能なんじゃないでしょうか。
にしても、初回接続時に特殊な操作が要るのはまいったものですね。
Pickit2だとそんなことは無かったのだけど。

通常の手順で更新不能なくらい重大なバグが入ったまま未だに販売してるのか、当たりが悪かったのか。

ネット上の情報によると、つなぐだけできちんと認識するPCと、そうでないPCもあるようです。
Windows 8.1(x86)なのが原因なのだろうか。


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

2014年11月20日

買ったぜ。

これで、昔ながらのPICを使った開発ができます。



pickit2がWin8.1に対応しなくなって、Arduinoばっか使ってたんですが、いい加減Arduinoのコスパの悪さに気がついてしまったので、戻りたくなりました。
posted by gpsnmeajp at 21:48| Comment(0) | TrackBack(0) | 未分類

2014年10月21日

USBサーモグラフィモジュールのバグについて

楢ノ木技研さんから出ている USBサーモグラフィモジュールの
一部ロットに存在するバグについて記述しておく。

該当ロットは、9月発売分のUSBサーモグラフィモジュール【特上】

いずれもシリアル通信モード時に遭遇するバグであり、
おそらくUSB接続時には影響しない。(確認していない)

1.シリアル通信不可
販売元トップページ(ショップではない)のINFORMATIONにも記述されているが
USB接続によるサーモ情報の取得はできるが、シリアル通信モードでどんな
コマンドを送信しても反応しない致命的なバグがある。

解決方法はファームウェアの書き換えか製品の交換である。
連絡して対処してもらおう。(私もtwitter上でやりとりし、pickit2で書き換えを行った)

2.フレームレート設定失敗
OTK-THG01/02シリーズ・シリアルモード仕様書 によれば、
このモジュールは512[frame/sec]まで対応しているように見受けられるが、
実際には8[frame/sec]までしか対応していない。
(製品仕様ページには ”フレームレート:0.5フレーム毎秒〜8フレーム毎秒”という記述がきちんとある)

しかし、フレームレートを設定するSETFコマンドにバグがある。
対応外の値を指定するとERが帰ってくるはずが、対応外の値を指定してもOKが帰り、
なおかつその際のフレームレートは以前の設定が保持されるため、設定に失敗したことに気が付きにくい。

電源投入後の設定でフレームレート設定に失敗した場合、初期設定の2[frame/sec]が
設定されたままとなる。

対処法は、対応しているフレームレート(0.5, 1, 2, 4, 8)のみを指定することである。




ちなみに、すべてtwitter上で報告済みであり、以降のロットでは修正されていることだろう。
posted by gpsnmeajp at 23:43| Comment(0) | TrackBack(0) | 未分類

2014年09月29日

ポケットサーモグラフィのプロトタイプ

数週間前に買ったUSBサーモグラフィ、シリアル通信が出来ず苦戦していたのだが
販売元に問い合わせてみると、ファームのバグだったらしい。

メインはPIC24Fだったので、手持ちのPickit2で頂いたHexファイルを書き込んで修復。
見事にシリアル通信ができるようになった。
以下の写真のサーモに5pinのヘッダが付いているのは、この書き込みの跡だ。

というわけで、かねてから計画していたポケットサーモを作ることにした。


画面には、簡単なシリアル通信で高度な描画が可能なe-DISPを使用。
センサーにはもちろんUSBサーモグラフィ。
制御は、シリアルポートとUSBシリアルが分離していてデバッグが容易なArduino Leonardo。

ArduinoのSoftwareSerialは、38400bpsでは送信はうまくいっても受信がうまくいかない。
そのため、ハードウェアUARTでUSBサーモと通信し、e-DISPにはソフトシリアルで送りっぱなしにすることにした。

e-DISPは、コマンドでいろいろと複雑な描画指定ができ、ここでは四角形描画コマンドを
使用して表示してるので、表示は実用レベルに早い。

表示できるようになると欲が出るもので、 補完処理が欲しくなる。

USBサーモのデモプログラムでは3次式補間(バイキュービック補間)を使用しているらしいが
これは結構重いらしい。
8bitマイコンでできる程度の補間といえば、ボカシとメディアン、直線近似くらいだろう。

一応、USBサーモを注文した段階でPC上でボカシ&メディアンな処理はやってみていたが
いまいちだった。
でもどうせならと、Arduino上で3x3のボカシ処理をするようにしてみると、あら不思議。
以外とまともな表示になるではないですか。



16x4を、48x12(限界)に拡大し、ここに3x3のボカシを掛けたのが、上記の画像である。
この時点では、処理にミスがあって端点ににじみのようなものが出てしまっている。
ちなみに、私の顔だ。



処理を修正し、元画像と並べて表示するようにしたのがこれ。私の手だ。
単にボカシを掛けただけなのだが、ここまで見やすくなるとは、本当に意外だ。

ここで、問題が出てくる。高解像度の表示をしようとすると、ぼかしの処理そのものが早くても、38400bpsの通信では遅い。

e-DISPにはダイレクトにピクセル単位で送受信する機能もあって試してみたが、
これでは四角形描画指示をするよりもむしろ格段に遅かった。

e-DISPそのものは、115200bpsまで送受信可能だ。
しかし、ArduinoのSoftwareSerialでは確実に通信できない。ハードウェアUARTに頼る他ない。
実際、115200bpsで表示したところ、さきほどまでのノロノロはどこへやら、高速に表示された。

しかしながら、SoftwareSerialの38400bpsでは送信できても受信がうまくいかないのは
先ほど言った通りだ。いくら表示が早くても、肝心のサーモ情報を受け取れないのでは話にならない。

USBサーモのボーレートが38400bps以外に変更できればいいのだが、それもできず。
というわけで、アホなことをすることにした。

_人人人人人人人人人_
> Arduino2台使用 <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄


実際の光景がこちら。


表示されない場合はこちら。

このあと、画面バッファの切替機能を使って描画中の表示を出さないようにするなど工夫している。
各種部品は注文したので、届き次第、ケースに組み込んで本当に携帯できるようにしたい。

今回は、ソースコードは載せないことにした。
ちょっと場当たりすぎて汚い。後々、リファインしたら載せるかもしれないが。

もし欲しい人がいたら問い合わせていただければお渡しできるかもしれませんが。

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