2012年12月9日日曜日

JPEGカメラを使ってみた


ストリナやスイッチサイエンスで売っているJPEGカメラモジュールを試してみた
上の画像はSTMを自撮りしたものだ


5k3kのような高解像度で非常に綺麗な画像に見慣れてしまうと
VGA程度で高圧縮されたJPEGはお世辞にも綺麗とは言えない画像だが
このモジュールは非常に簡単に扱うことができる

といってもまだすべてが上手く動いているわけではない
計算上ではVGAを標準画質で読み出せば20秒もかからない
だがまだ2分以上かかっている

PCにつないでC#で試したときは問題なかったからプログラムの問題だろう

また、画質の変更はC#でもうまくいっていない
画質を下げる方の設定はできるが
画質を上げる設定ができない

なお、画像解像度は標準がQVGAだが
VGAに変更することも可能だ
スイッチサイエンスには不可能と書いてあるし
Arduinoで試した限りは変更ができなかった
だがC#からコマンドを送信した結果解像度を変更することができた


基本的にこのモジュールはリセットコマンドを送信してほとんどの変更をリセットすることができる
例えば画像の圧縮率やビットレートだ
もしもビットレートを間違えて設定しても電源ケーブルを挿し直せばリセットされる
これが意味することは リセットした後は必ず38400bpsで通信する必要があるということだ
9600bpsで通信しようとしても最初のリセット時は必ず38400bpsで転送しなくてはいけない

ただし画面解像度だけは基盤に実装されているEEPROMに記録されるため
リセットをしても変更は維持される

保存される値と保存されない値の違いがよくわからない
ビットレート等をリセットするなら解像度もリセットすればいいのに

ココらへんは10ページ程度のPDFには書かれないコマンドがあるのかもしれない


まだまだ缶サットに組み込むには問題があるが
一応の目処は立った


でも、前にロガーを作ったときは すべての部品を組み合わせた時に不具合が出たんだよなぁ…

2012年12月4日火曜日

電力モジュール

ストリナの電力モジュールを試してみた
コレ

TIのINA226というICが乗っていて
I2Cで電圧と電流 それに電力が読み出せるというモノ
電流センスのために2mΩ1%というシャント抵抗が実装済みで
アナログ的な部分はほとんど扱わなくてイイ という優れもの
のはずだったんだが…


手前にあるモジュールが電力モジュール
いくつかの抵抗やパスコン それに1個のICが乗っている

実はこのモジュール
缶サットのソーラーパネル用に買ったものだ
本来であればキャパシタの電圧と電流を計測するはずだったのだが
このモジュールでは電流は分解能1.25mAで計測することになる
小型のソーラーパネル1枚程度だと充電電流は0.2mAから0.01mAととてもこのモジュールで読めるような電流ではない

ということでシャント抵抗の外付けを考えてみたのだが…
RSで6500円で売ってる電流センス用の抵抗というのがあって
それは外部に専用ADCを載せればこのモジュールを使わなくてもいいんじゃないか?
ということになって悩んでいるところだ

充電電流を考えると0.05mAくらいの分解能は欲しい
放電を考えるなら+25mAから-500mAくらい欲しいのだ
いったいどうやって実現するか...

なお、このモジュールの名誉のために言っておくと
負荷として小型のモータを接続した場合
直列に入れたテスターの電流値と3%ほどしか違わなかった
この時の電流は50mA程だったが
数十mAから数Aであれば正常に計測できるだろう


/* *** */

それと
ついに本格的に缶サットを考え始めた
というか、上記のモジュールも缶サットの機能の一部だったのだが

現状では
STBeeMini X1
LIS331HH X1
L3G4200D X1
HMC5883L X1
他...
という構成だが
STBeeMiniを2枚使ってみようか と思い始めた

1枚はメインのデータ処理に専念し
ピンの操作やデータの送受信は2枚目のSTBeeMiniが担当
という感じだ
こうすればマルチスレッドの用な感じで処理ができるし
だいぶ楽になるはずだが
すべてのデータをSPIなりで通信するから
そのデータをどうやって送受信しようか
というところでつまずいてる

どうせ2枚重ねにしようにも部品が無いから
しばらくは1枚でやれるところまでやってみるつもりだが

2012年11月17日土曜日

Media Centerのアス比を変更する

Media Centerをウインドウモードで表示すると
画面のアス比にあわせてウインドウのアス比も変更するようです
何が問題って16対9の画面に4対3のウインドウに16対9の映像を上下黒帯で表示されるとジャマでジャマで...
しかしアス比は自動認識らしく変更する方法が見当たりません

ってことで今までいろいろ試して一番成功率が高い方法をメモっておきます

勝手に4対3になるのは
僕の画面環境が16対9と4対3を1枚ずつ使ってるせいだと思いますが


1. Media Centerのウインドウを16対9の画面に移動する
2. フルスクリーンにする
3. Media Centerのタスク>シャットダウンで再起動
4. ユーザーにログイン後Media Centerを起動する
5. ウインドウモードに戻す

大抵の場合この方法で16:9に戻ってくれてます


Media Centerって使いやすいとは言えないですが
メーカー製の地デジ視聴ソフトとかよりは使いやすいです
というか市販の専用ソフト使って見る地デジ使いづら過ぎ
どうしたらあんなに使いづらいのか
そもそも初期設定すら失敗してるし…
1回失敗したらOS再起動しないと起動すらできなくなるし

23のテレビでよさそうなのがパナからあるので
録画用HDDと一緒に買おうかと思ってます
2チューナーなので1番組見ながら1番組録画もできるし
(2番組同時録画はムリっぽい)

2012年11月13日火曜日

K-5でテザー撮影

K-5でテザー撮影をしてみたので
報告がてら覚書も含めて

まず、テザー撮影って何?
テザー撮影とは
カメラをPC等と接続し、PCから設定を変更したりシャッターを切ったり、あるいは撮った写真をそのまま読み込める
という感じ だと思います

レリーズと明確に区別されるのは
撮った写真を転送できる
とかでしょうかね?

で、このテザー撮影
Lightroomとかにも搭載されていますが
対応してるカメラがほとんどありません

しかし PENTAX K-5等は非公式に対応しているらしく
ユーザーが作成したソフトウェアでテザー撮影が可能となっています


今回はPK_Tetherというソフトを使いました


.NetFFW3.5上で動作するとのことで
対応カメラはK-x/K-7/K-5/K-r/K-20D/K-10D/K-200だそうです
僕はK-5/FW1.13でのみ確認しましたが

細々と不具合はいくつかあるようですが
純正じゃないので多くは求めません
特に問題も無いですし

RAWで撮って確認しよさそうなのを保存してLR4に読み込んで現像
というのが凄く簡単に出来ます

上記カメラを持ってて 机の上の小物を三脚で撮ったりする人はためしてみると面白いと思います

2012年11月4日日曜日

整数を文字列に変換する関数

整数を文字列に変換する関数を作ってみました

通常はsprintfとかでも十分ですが
今作ってる機材でprintf系の関数が使えない事態(ROMとかの問題ではない)が発生したので
後学のためにも作ってみました


微妙に高性能なitoa という感じです
簡単な動作確認はしましたが正常に動く保障はないです
多少高性能な事によるメリットよりも安定性が低いデメリットのほうが上回る程度です


2012年10月31日水曜日

MAX31855Kの計算

MAXIM製の熱電対IC MAX31855K というICがあります

これはK熱電対の温度を計算してデジタル値で取り出せるというIC
冷接点の計算もおおよそやってくれるので
楽に扱うことができます
I/FはSPIっぽい物(一方通行のSPI)なので
SPIモジュールがあるならそれを使えるし
ない場合でもGPIOを操作するだけでいいので簡単です

ICとしては特にクセは無いようなので
ハードウェアの詳細は省略します
とりあえずCSを立ち下げてクロックを32個送りながら読み取って最後にCS立ち上げれば大丈夫です

スイッチサイエンスやストロベリーリナックスで買うことができますが
スイッチサイエンスで僕が買ったものは良い感じに動いてくれませんでした

ストロベリーリナックスで買った物は正常に動いたので

付属の熱電対の相性や微妙なパターンの違いが影響しているようです


さて、このICは固定小数点で出力されます
なので何らかの方法で計算する必要があります
って別にヘンなフォーマットなわけではないのでどうということも無いですが

とりあえず僕が使ったテストコードを置いておきます
VC++2010で作りました
全角文字使ってるので多くの場合は書き換えが必要です


#include <stdio.h>

int MAX31855K_calc(unsigned int 出力値, double *熱電対, double *冷接点) {
    unsigned int 熱電対値 = (出力値 >> 18) & 0x3FFF;
    unsigned int 冷接点値 = (出力値 >>  4) &  0xFFF;
   
    if (出力値 & 0x10000) { return(出力値 & 0x7); }

    if (熱電対値 & 0x2000)
    { *熱電対 = ((熱電対値 ^ 0x3FFF) + 1) * -0.25; }
    else { *熱電対 = 熱電対値 * 0.25; }

    if (冷接点値 &  0x800)
    { *冷接点 = ((冷接点値 ^  0xFFF) + 1) * -0.0625; }
    else { *冷接点 = 冷接点値 * 0.0625; }

    return(0);
}

int main(void) {
    unsigned int 出力値 = 0xFEA4E670; // ICから読み取った32bitデータ
    double 熱電対 = 0, 冷接点 = 0;
    int s;

    s = MAX31855K_calc(出力値, &熱電対, &冷接点);

    printf("%d:%.2f/%.5f\n", s, 熱電対, 冷接点);

    return(0);
}



ビットシフトやXOR等を使っています
出力に浮動小数点を使ってるので
それなりの環境じゃないと満足な結果は得られません

動作としては
まずFaultBitを確認して エラーが発生していればデータ下位3ビットを返します
障害がなければ熱電対と冷接点の温度を取り出し
符号を確認して必要ならビット反転等を処理してから
適切な値を掛けてポインタで指示された変数に結果を入れます
そして戻り値0で戻るだけ

もしも戻り値が0位外ならばその旨を表示するべきです
戻り値&0b001 != 0なら熱電対を検出できていない
戻り値&0b010 != 0なら熱電対がGNDに短絡している
戻り値&0b100 != 0なら熱電対がVCCに短絡している
という感じになります

これは戻り値を見る必要はなく データの下位3bitを比較するだけでもいいです


しっかし ソースコードに全角文字って気持ち悪いね
「全角使える環境ならヘタに変数名考えるより漢字割り当てたほうが楽」
ってことで試してみたけど


2012年10月17日水曜日

LIS331HHとL3G4200Dのアドレスマップ

STMicro製加速度センサのLIS331HHと
STMicro製角速度センサのL3G4200Dのアドレスマップです

両方共スイッチサイエンスで買うことができます

範囲が広いので様々な用途に使えそうなセンサ


アドレスマップ メモっときます


2012年9月18日火曜日

熱電対でホームベーカリーの温度プロファイル

熱電対を入手したので
ホームベーカリーの温度プロファイルを採ってみました

使用した熱電対はこれ
スイッチサイエンスの黄色い熱電対です
これは-200℃~+1350℃まで測れるというもの
ただ 僕が試した限りではノイズなどが多く 数十℃の誤差を覚悟するべきものでした
(たぶん電源周りの問題ですが)

また熱電対の他に低温向けの温度センサも使用しました
-40℃~+125℃までをアナログで出力するものです
ただし今回は配線長の長さ等によりノイズが大量に入ってしまいました

これらのセンサはmbedを使用し
mbed内のメモリにTXTとしてカンマ区切りで書き込んだ後
PCでCSVに拡張子を変更してからエクセルでグラフ化しました

得られたグラフは↓

外部温度 が9700を筺体壁面に貼りつけた温度
絶対熱  は熱電対と補正値を足した温度
相対熱  は熱電対単体
補正熱  が熱電対IC内の温度計から得られた温度
補正後  が絶対熱+20 です

熱電対は-20℃程度ドリフトしていたように感じたので
+20としました

ただ 20℃はちょっと大きかったかな と思ってます
赤と水色の間程度がちょうどいいかもしれません

熱電対は ケースに↓のようにカプトンテープで貼り付けました

熱電対先端は左下側にあります


この図を見る限りでは
前半に撹拌/発酵
中盤で焼いて
後半は冷めているだけ という感じのようです
中盤で温度がギザギザになっているのは
20℃程度のヒステリシスのあるサーモスタットを使用した結果と思われます

中盤の温度が2段階になっているのは
まず外側を焼きあげてから
中をじっくりと焼きあげる と予想されます

また外部温度は
最大で50℃を超えていますが
それ以降も内部温度は上昇しているため
ある程度の温度で安定していると予想されます


ノイズ等は多いですが
最初の動作確認という意味では成功だと思います

ストリナで売ってる熱電対(ICは同じ)も買ってみたので
次はこれも併用してみたいと思います

2012年9月10日月曜日

バトルシップ

バトルシップのDVD
数日前に届いたので 見なおしてました


あらすじとしては

アメリカにて太陽系外の地球型惑星との交信を試みる国際ビーコンプロジェクトが立ちあげられ、ハワイ、オワフ島に造られた送信施設より、送信が開始されて数年後の2012年。世界14カ国の海軍将兵2万人が参集する環太平洋合同演習(RIMPAC / リムパック)が開催されようとしていた。参加艦艇の1隻である米海軍所属ミサイル駆逐艦、USSジョン・ポール・ジョーンズの乗員であるアレックス・ホッパー大尉は恋人であるサマンサとの結婚を彼女の父親であるシェーン提督に認めさせようとしていた。が、同じく、演習に参加しているナガタ一等海佐と喧嘩沙汰を起こしたことから結婚を認められるどころか、演習後の懲戒免職処分を突きつけられる。
そんな中開催された演習であったが、時を同じくして宇宙より正体不明の5つの物体が太平洋を目指して降下してくる。その内の一つは人工衛星と激突して分解し、中国、香港を中心として世界各地に落下、大規模な災害を引き起こす。残った4つの物体はハワイ近海のリムパック艦隊近辺に降下。その正体を調べるべく、リムパック艦隊はアレックスの兄であるストーンを指揮官とした分遣隊を派遣することを決め、USSサンプソン、護衛艦みょうこう、そしてアレックスが乗艦するUSSジョン・ポール・ジョーンズの3隻が派遣される。アレックスらがボートにて海上に姿を現していた巨大な構造物を探索していたさ中、突如、物体から強大なエネルギーフィールドが展開され、ハワイ諸島全域を覆いつくし、分遣隊の3隻の駆逐艦はより外洋にいたリムパック艦隊から隔離されてしまう。更に構造物の周囲の海中から正体不明の物体、もとい異星人の大型機動兵器3機が現れ、3隻の駆逐艦にむけ攻撃を開始。強力な電波妨害によって戦闘力を削がれた3隻は碌に応射も出来ないまま、集中砲火によりUSSサンプソンが撃沈され、ストーンを含めた乗員全員が戦死。USSジョン・ポール・ジョーンズも至近弾を受け、艦長、副長を含んだ上級士官が多数戦死してしまい、その時点でもっとも階級が高いアレックスが急遽艦の指揮をとることとなる。アレックスは兄を殺された怒りにまかせて突撃をかけるが、援護をしようとしたナガタの護衛艦みょうこうも被弾して撃沈されてしまい、部下からの説得でアレックスは攻撃を取りやめ、ナガタを含んだみょうこうのクルーの救助を行い、一時撤退。更に白兵戦を仕掛けてきた異星人の一部をなんとか退けたアレックスらはナガタらの協力の元、反撃のプランを練る。
異星人の攻撃部隊がハワイ各所を攻撃するなか、孤立無援となったUSSジョン・ポール・ジョーンズはアレックスの指揮の元、異星人に対して反撃を開始する。
 Wikipediaより
という感じ

舞台はリムパック2012
駆逐艦を駆使して未知の敵と戦う
VLSや艦砲 CIWS 魚雷 あらゆる装備が駆使されています
更に戦艦"ミズーリ"を使用した終盤の戦闘

その方向が好きな人からすればかなり好きなジャンルなのではないかッ?


低評価のレビューもちらほらと見かけますが
僕は好きです
映像として 面白いです

全体で見てもTFRやTF DsMよりも面白いのでは?


盛大に突っ込みたいのは
「なぜ敵が衛星通信をしようとしているのに衛星を落とさなかったの?」
SM-3とか使えそうなもんだけど
生きてる衛星は十分高高度だから無理か…
それにしたってハワイ以外の場所から衛星を殺すくらいはできて当然だと思うんだが…


さて、チキンブリトーを(ry

2012年8月16日木曜日

年月日時分秒からUNIXtimeに

年月日時分秒をUNIXtime(秒)に変換する関数です



 int YMDhms2s(int Y, int M, int D, int h, int m, int s) {
    int y = Y - 1970;
    int res = 0;
    while(y > 0) {
        if ((y % 4) == 0 && (y % 100) != 0 || (y % 400) == 0) {
            res += 31622400;
        } else {
            res += 31536000;
        }
        y--;
    }
   
    switch(M - 1)
    {
    case(12): { res += 2678400; }
    case(11): { res += 2592000; }
    case(10): { res += 2678400; }
    case( 9): { res += 2592000; }
    case( 8): { res += 2678400; }
    case( 7): { res += 2678400; }
    case( 6): { res += 2592000; }
    case( 5): { res += 2678400; }
    case( 4): { res += 2592000; }
    case( 3): { res += 2678400; }
    case( 2): {
        if ((Y % 4) == 0 && (Y % 100) != 0 || (Y % 400) == 0) {
            res += 2505600;
        } else {
            res += 2419200; }
              }
    case( 1): { res += 2678400; }
    default : { break; }
    }

    res += (D - 1) * 86400;

    res += h * 3600;
    res += m * 60;
    res += s;
   
    return(res);
}

まずは年を秒に変換します
めんどくさいのでwhileを使いましたが
すっげー遅くなるので本来は使うべきではない

次に月を秒に変換しますが
ここは
1. 1ヶ月の長さがまちまち
2. 2月は閏年を考慮する必要がある
という理由により
switchを使っています

そして日 時 分 秒をそれぞれ計算していきます
流れとしては非常に簡単
一応正常に動いてるっぽいので 大丈夫なはずです

なお閏年判定のコードはwikipediaから拝借しました

このコードはUNIXtimeに変換するものですが
定数の変更でNTPtimeも対応可能なはずです

前にUNIXtimeを文字列に変換する関数もおいてるので
それと組み合わせれば色々と遊べます
まぁ組み込みとかの内の一部用途でしか使い道無いんですが

一応32bitだと2100年くらいまで処理できるので
しばらくの間は大丈夫だと思います

2012年8月15日水曜日

年月日から曜日を計算する

年月日から曜日を取り出す関数です


#include <stdio.h>

int ymd2w(int _y, int m, int q) {
    int J = _y / 100,
        K = _y % 100;
    return((q + (((m + 1)*26) / 10) + K + (K / 4) + (J / 4) - (2 * J)) % 7);
}

int main(void) {

    printf("%d\n", ymd2w(2012, 8, 15));

    return(0);
}
  
楽っすねー
関数じゃなくて マクロで実装したほうが便利かもしれないけど

今回は
を参考にしました

ちなみに
この関数からの戻り値は
日曜=1
月曜=2
...
金曜=6
土曜=7
になるので
コードによっては というか かなりの場合 デクリメントしないと正常な値として扱えません

つーことで
年月日から曜日を計算するコードでした

2012年8月14日火曜日

strstr 関数

strstr関数です
文字列の中から文字列を検索しポインタを返却
という感じの関数です
GCCでコンパイルしたら警告出ます
const charをcharとして戻り値に入れてるからだと思いますが


標準ライブラリ

自分でちょこちょこ作ってる標準ライブラリの関数を
ここに貼り付けることにします
理由:あとで探すのめんどくさくなってきた

最低限の動作確認はしていますが
ホンモノとまったく同じ動きをするという保証はどこにもないので
あまり使わないほうが懸命です

string.h周りが多くなると思いますが

2012年8月11日土曜日

自作strtok関数

GPSのデータのデコードにstrtokを使ったら楽なんじゃないかな
とか思って 自分で作ってみました

本来のstrtokは
char *strtok(char *s1, const char *s2);
ですが
今回はそんなに高性能じゃなくてもいいので
uint8_t *StrtokB(uint8_t *s1, const char s2);
として
複数の文字を指定する機能は付けていません

以下コード

2012年8月8日水曜日

キャラ液晶とスイッチの共存

トライステートの電波時計(秋月)の回路図を見ていると面白い回路が含まれています


PICと液晶の間になにやらスイッチが入っています


通常キャラ液晶には6本のIOが専有されます
(最大で11本が専有されるモードがありますが まぁ 普通は使いません)

で そのうち5本は基本的に他の用途にも使うことが可能です
そのうちキリのいい4本をスイッチに使っているわけです
(LCDのE端子は他の用途に使うことができません)


どのマイコンでもIO不足は深刻なので
これをSTBeeMiniで試してみます

回路は↓こんな感じ

今回はスイッチを8個使います
また抵抗とかめんどくさいのと スイッチ数を増やしたかったので
ポートでGNDに落とします
これはオープンドレイン動作が有るARMならではといったところです
PICだとめんどくさいですねー

この回路であれば大量のスイッチを使用することや
スイッチが押されているときにLCDの操作が有っても問題なく使用可能です


御存知の通りLCDの中にはプルアップ抵抗がありますが
どーもこの回路ではそのプルアップ抵抗を期待できないらしいです
ということで 今回は4本のポートにGPIO_Mode_IPUを指定することで正常に動作するようにしています


とりあえず今回はこんなところで
追ってソースコードをサブページにおいておくと思います

2012年7月26日木曜日

Cで度分形式を度に変換する

GPSから出力されるNMEAの度分形式を度に変換するコードです



  1. #include <stdio.h>
  2. void dm2d(const char *str, char *data) {
  3.     int cCnt = 0, i = 0;
  4.     int d = 0, m = 0, cm = 0, cmc = 0;
  5.     while(*(str + cCnt) != '.') { cCnt++; }
  6.     while(i < (cCnt - 2)) { d = (d * 10) + (*(str + i++) - '0'); }
  7.     while(i < (cCnt)) { m = (m * 10) + (*(str + i++) - '0'); }
  8.     i++;
  9.     while(*(str + i) != '\0')
  10.     { cm = (cm * 10) + (*(str + i++) - '0'); cmc++; }
  11.     sprintf(data, "%3d.%0*d", d, cmc + 1, (((m * 10000) + cm) * 10) / 60);
  12. }
  13. int main(void) {
  14.     char str[20];
  15.     char data[20];
  16.     scanf("%s", str);
  17.     dm2d(str, data);
  18.     printf("%s\n", data);
  19.     return(0);
  20. }

浮動小数点数を使っていないので標準的なprintf等を使わなくても簡単に出力できます

桁数が少ない等の問題はありますが
とりあえず正常に動いてるっぽいので置いておきます
気が向いたら度から度分秒に変換したり度分から度分秒に変換するコードも書くかも

2012年6月14日木曜日

マルチモニタのWin7環境で複数の壁紙

Win8ではマルチモニタに
個別に壁紙を設定できるようですが
Win7ではそのままでは不可能です
ですが まぁめんどくさいけど不可能ではないです

ってことで手順
今更 とか
何番煎じ とか 言わないでください お願いします 泣きます

最低限の条件として
PCの操作に慣れている/画像のリサイズやトリミングが普通にできる
くらいは必要なスキルです



まずPCのスペック
Win7 x64 U
プライマリに1920*1080
セカンダリに1280*1024を縦置き
という感じです


では…


普通に右クリックの壁紙設定だと
このように同じ画像が
変な配置で表示されてしまいます


で、まずは各解像度の画像を用意します
大きさが合わない場合はトリミングやリサイズで対応してください

今回は

を使います
横長が画面1で縦長が画面2に使います

次に画面2の画像を加工します
と言っても画面1の分左側に空白を作るだけです
今回はFHD画面が1なので
左に1920pixel増やしました

こんな感じです
今回は 画面2の縦解像度>画面1の縦解像度 だったので縦はいじっていませんが
画面1のほうが縦に大きい場合は 画面1の縦に合わせてリサイズします

そして
画面2用の空白部分に画面1の画像を貼り付けます
ここまでの手順が正常であれば横幅がぴったり合うはずです

ここまで加工した画像が↓
縦解像度が1280
横解像度が2944
の画像となります

最後にこれをデスクトップの背景に設定します


もしも↓のようにずれてしまった場合は
デスクトップ右クリックで個人設定を選び
デスクトップの背景をクリックした後
画像の配置で並べて表示を選択します

これでうまくいくはずです



ちなみに、僕がWinXPを使っていた頃だったと思いますが
あの頃は普通にフリーソフトで設定していました
ただそれはDexpotと相性が悪かったので
自分で加工するようになりました
そういうしがらみがない場合はフリーソフト探してきたほうが楽だと思います


MacOSはFinderから壁紙を設定した時に反映されるのが遅いという欠点はありますが
壁紙とか窓管理とか 便利なOSですね
でもMac OS X 10.8にはあまり魅力を感じないんだよなぁ…
SNS強化とかコミュ障には関係ないですし(キリッ


ってことで 各画面に壁紙を設定する方法でした
これで自由におにゃのこを画面に配置することもできます((

2012年6月8日金曜日

C++でFizz Buzz

C++なんて使ったことねーよ
ってことで
たぶんこれよりうまい方法はいっぱいあると思うけど
めんどくせーんでこれでいいよね(

もうちっとややこしい方法も考えてみたんだけど
動かなかったのでifをネストしました

まぁ 動作は
みりゃわかるよね これくらい

では ノシ

2012年5月31日木曜日

シュアファイア

シュアファイアのフラッシュとか
欲しいなぁと思うんですけど
シュアファイヤのって高確率で123Aを使ってるんですよね

この電池 かなり前に発売された気がします
5年近く前

当時は「大容量、低価格、高耐久。そして安全」みたいな触れ込みだった気が
電動バイクのパワーソースになったり
電動工具とかにも使われてたと思います
要は 二次電池のはずなんですよ
実際に123A対応充電器とかも売ってますし

でも 12本入りで2000円台という値段を見ると
確実に一次電池ですよね
いや すっげー安い二次電池という可能性もあるんですけども

どっちにしろ 充電器が高いんですよねぇ

で、買うのを躊躇してます
純正電池がそんなに高くないんで
電池も大量に買えばいいんでしょうけど
2本で2時間しか使えないとなると あまり気軽に使えないんですよねぇ

でも 市販の「明るい」というLEDライトはたいして明るくないのが
経験的にわかってるので
とっとと明るい奴に移行したいです

僕が今使ってるのはOHMの140〜180lmの間くらいのモノだと思いますが
白なので せいぜい数十メートル程度しか照らせないです

ダイビングライトとか スゴい明るいらしいですけど
値段もスゴいですしね
シュアファイヤも値段は結構しますが
ブランド力がありますし

あとはS&Wも作ってるっぽいですね
こっちは安いですし単四電池で動くという利点もありますが
どうなんだろうなー とか思っちゃいます

で 何が言いたいかって
「明るいライトがほしい」
もちろん操作性のいいやつ
OHMのは普通の懐中電灯としてしか想定していないらしく
スイッチの操作性が悪いのと
ゴミでスイッチが簡単に使えなくなっちゃうので
なにかいいのないっすかね

2012年5月27日日曜日

らいとるーむふぉー 導入してみた

Lightroom4 略してLR4 導入してみました
PicasaでRAWの処理は無理だなー と思ったので
iPhotoはノーパなのでHDDの容量的な問題
ということで WinにLR4です
たぶん初めてアドビ製品買いました


LR4の利点とか欠点とか


2012年5月15日火曜日

ARMの変数型名

ARMは環境依存の変数型を無くすために普通のCとは違う名前で型が宣言されてます
ってことで その一覧です


通常の宣言 CMSISでの宣言
-
signed long - int32_t
- signed short - int16_t
- signed char - int18_t
- signed long const const int32_t
- signed short const const int16_t
- signed char const const int8_t
volatile signed long - __O int32_t
__IO int32_t
volatile signed short - __O int16_t
__IO int16_t
volatile signed char - __O int8_t
__IO int8_t
volatile signed long const __I int32_t
volatile signed short const __I int 16_t
volatile signed char const __I int8_t
- unsigned long - uint32_t
- unsigned short - uint16_t
- unsigned char - uint8_t
- unsigned long const const uint32_t
- unsigned short const const uint16_t
- unsigned char const const uint8_t
volatile unsigned long - __O uint32_t
__IO uint32_t
volatile unsigned short - __O uint16_t
__IO uint16_t
volatile unsigned char - __O uint8_t
__IO uint8_t
volatile unsigned long const __I uint32_t
volatile unsigned short const __I uint16_t
volatile unsigned char const __I uint8_t

↑の表のように 用途によって 色々と決まりごとがあるみたいです
(excelからコピペしただけなので見づらいですがご了承ください)

もちろん普通のCのようにintとかcharとかboolも可能ですが
この表に従ったほうが環境依存が減るので楽なんだそうです
覚えるのめんどくせーよ…

で ちょっと解説
かなり憶測を含んでるので間違ってたらごめんなさい
まず型の大きさですが
これはint+ビット数で決まります
コンパイラ依存のビットサイズじゃないので
移植が楽だけではなく 読むときにも楽なんだそうです

signed/unsignedですが まぁこれは説明しなくてもわかりますよね
符号あり/なしの区別です
符号ありはint 符号なしはuintです
constは定数か否かみたいな意味合いもありますが
組み込みの場合はRAMかROMかという違いもあります
でもまぁあまり意識することはないと思います

で 問題なのがvolatileっていう国の名前みたいなモノ
これはコンパイラの最適化を無効化するみたいな意味があります
例えば
uint8_t flag = 1;
while(flag) { ... }
というコードがあったて ブロックの中でflagを書き換えていない場合
コンパイラは
while(1) { ... }
と書き換えます

これは「どーせ値が変更されることはないんだから判定するだけムダ」という理由によるものですが
もしかしたらこのflagは割り込みで変更される可能性があるかもしれません
例えばシリアルの送信完了でRESETされる場合
本来は送信が終了されるまで待つだけのはずなのに
実際は無限ループに陥ってしまいます

これを回避するためにvolatileをつけることにより
「この変数は外部から変更されるので強い最適化はしないように」
ということになります

volatileについてはこのページがわかりやすいです

__IOだけでなく__Oも有るのは
コード中から間違って書き換えないように ということだと思います
が __Oを使う用途というのはあまり思いつかない(無いわけではない)


とりあえず こんなところですが
今まではARMでも普通にintとかcharとか使ってたけど
これから少しずつint32_tみたいな書き方に移行していこうかなぁ と 思ったり

2012年5月7日月曜日

宇宙兄弟 見てきたよ

映画 宇宙兄弟
見てきました

見始めてから思ったんだけど
僕、邦画嫌いだし(´・ω・`)
最近映画館で見たモノは全部洋画だったから
映画館では洋画ばっかりと無条件に思ってた

が、宇宙兄弟は面白かったですね

いろいろ突っ込みたいところはありましたが

で、問題の
南波六太が冒頭で使ってるPCのOS
あれは 間違いなくWinXPです えぇ
2025年でも企業の中ではXPが使われてるんですねぇw

あと
NASAのロケットの打ち上げシーン
字幕で
「燃料ロケット分離」という感じのがありますが
アレ どう考えても
「固体燃料ロケット分離」
ですよね
SRBって言ってるし

でも まぁそんな些細なことは大した問題じゃないですね
結構面白かったですよ
この映画

ついでに言うと
六太が探しものをしているシーンで
α-3が一瞬映ってましたね
あと2030年でもM4が使われているらしいです


以上、宇宙兄弟見てきたよ ということで

2012年5月6日日曜日

STBeeでDAC

STBeeには12bitのDACが2本あります


PA4のDAC1とPA5のDAC2です
で これが使えれば面白そうだなぁと おもって
関数もADCより少ないので 楽にできそうだな と思って
試してみました

2012年5月4日金曜日

Fizz Buzz

暇だったので
やってみました
あまり良い感じにはならないね


こんな感じになりますが↓
たぶんあってるはず
ifのネストだと面白く無いってことで変なコードだけど
だからといってなぁ…

2012年5月2日水曜日

Makeで書込み

STBeeをストリナの環境で書き込む場合
1.コードエディタ
2.Cygwin
3.コマンドプロンプト
が必要になります
ですが
Chromeでいろいろ見つつTweenでつぶやきつつ となると 結構狭い

ってことで Makeコマンドで書込みまで出来るようにしてみた

まず Makefileに

program: $(TARGET).hex
dfuw $(TARGET).hex
の2行を書き加える
これにより
make program
で書き込みをすることができる
が これだけじゃ意味が無い
と言うことで
all: gccversion build sizeafter
の後ろに
 program
を書き加えて
all: gccversion build sizeafter program
とする
こうするとmakeコマンドでビルドから書込みまで出来るようになる

欠点を挙げるとすると
Cygwinは漢字とかが苦手みたい
なので 正常に書き込めた場合は問題ないのだが
正常に書き込めなかった場合(STBeeがつながってない とか)に ちょっとアレなことになる

具体的にはこんな感じ↓
上が正常に書き込めた場合
下が正常に書き込めなかった場合

ちなみに 「正常に失敗」した場合は ↓みたいになる

でもまぁ
「正常なら"done."って表示される」
「正常じゃないなら変にバケた文字が表示される」
ってことで わかりやすいしいいんじゃないかとw

Makefileはまったくわからないので
こんな書き方でいいのか とか
色いろあるのだけど
一応動いてるので良いことにする


ストリナさん
Mac OS Xで動作するDFUW お願いします><


DFUW使わないならMac OS Xでもいいのかな?
でもどっちにしても今手持ちのMBPはHDD空き容量がかなり少ないから
しばらくは本格運用出来ないしなぁ

2012年4月30日月曜日

ARMで時間待ち関数

PICで時間待ちをしたい場合
delay_ms(n);やdelay_us(n);といった関数で(ほぼ)正確な時間待ちができますが
ARMにはそう言った関数が用意されていません
(たぶん)

正確な1秒であればRTCでも作れるので
1日に1回 というレベルの時間待ちならそれで十分ですが
マイクロ秒単位での時間待ちだと使えません
と言うことで
タイマ2を使用して(ほぼ)正確なウエイト処理を書いてみました
検証環境はSTBeeに例のごとくストリナの開発環境です


2012年4月26日木曜日

STBeeとか TIM2初期設定

STBeeでTIM2を動かすための設定メモ


コンセント

何回目だっていうネタですが
やっぱり気になるので コンセントの使用数のカウントです


  1. デスクトップ(Win7マシン)
  2. デスクトップ(WinXPテストマシン)
  3. MacBook Pro
  4. プリンタ
  5. 無線LANAP
  6. LANハブ
  7. 画面(24)
  8. 画面(19)
  9. ケトル
  10. ライト
  11. 5V電源(電子回路用)
  12. 15V電源(or12V電源)
  13. 卓上ドリル
  14. オシロスコープ
  15. スピーカー
  16. PocketWi-Fi
  17. USB電源(布団でiPhoneとか充電用)
  18. ハンダゴテ

ざっと思いつくくらいでもこれくらい使ってる
こえーよ(´;ω;`)

とりあえず
自分で部屋を設計するとしたら
上記×2位くらいの容量に耐えられる配線が欲しいなぁ

しっかし この部屋の全体の電気代とかどれくらいになるんでしょ(´・ω・`)

2012年4月22日日曜日

秒から年月日時分秒に

C語で秒から年月日時分秒に変換するコードです
標準関数?
それが無いんだなぁ
(探し方が悪いんだろうけど 自分で作ったほうが早かった というか printfですら無いんだからtimeとか探す気にも(ry)


2012年4月20日金曜日

STBeeMiniでタイマ割り込み+Lチカ

とりあえず
汚いですが ソースコードです
全体で100行超えちゃうのでもっと読むからどうぞ


STBeeMiniでタイマ割り込み

STBeeMiniでタイマ割り込みを実装してみました
とりあえず動いたので報告だけ
ソースは綺麗にしてからうpします

1mS毎に割り込みをかけてLEDをチカチカさせます
まぁ500Hzだと点滅なんぞわかりませんが

正確に500Hzじゃないのは
 水晶の精度か定数の設定か
計算上クロック1個分少ないと500.006945Hzになるので
多分定数のミスです
とりあえず ミリ秒単位で割り込みが出来れば1000カウントとunsigned longで起動時間管理が楽になるので いろいろ面白いことができると思う

タイマ割り込みと USART実装して あとADCが出来れば
データロガーとして使えるので 面白くなりそう

あとはprintfが使えれば文句ないんだけどなぁ…w

2012年4月8日日曜日

STBeeでUSART

やっと!STBeeで1バイト送信ができるようになった
なんで動かなかったかというと
USART_Cmd(USART1, ENABLE);を忘れていた
というか知らなかった という…
ってことで GPIOを初期設定後にASCII'A'を送信しつつLチカするコード↓
開発環境はストリナに書いてある方法です
アレ楽でいいね!!

#include "stm32f10x_conf.h"
#include <stdio.h>

#define GPDON(PIN) { GPIOD -> BSRR = _BV(PIN); }
#define GPDOF(PIN) { GPIOD -> BRR  = _BV(PIN); }
#define GPDSET(PIN, bit) { if(bit){ GPDON(PIN); }else{ GPDOF(PIN); } }


void Delay(volatile unsigned long delay)
{ while(delay) delay--; }

int main(void) {
    int flag;
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
                  
    // システムを初期化します(外部水晶をONにし72MHz動作に切り替えます)
    SystemInit();
                  
    // GPIO Dポートのクロックを有効にします
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // PD.4ポートを出力にします。PD.4=LED Lowで点灯
    GPIO_InitStructure.GPIO_Pin = _BV(4);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure); // 初期化関数を読み出します。

    // PA.9 Output
    GPIO_InitStructure.GPIO_Pin = _BV(9);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
                  
    // PA.0ポートを入力に
    GPIO_InitStructure.GPIO_Pin = _BV(0);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
   
    // USART init
    USART_InitStructure.USART_BaudRate = 9600;
    USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits = USART_StopBits_1;
    USART_InitStructure.USART_Parity = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode = USART_Mode_Tx; /* | USART_Mode_Rx */ // ←受信機能を有効にするにはコメントアウトを解除

    USART_Init(USART1, &USART_InitStructure);
    USART_Cmd(USART1, ENABLE);
   
    for ( ; ; ) {
        USART_SendData(USART1, 'A');
        flag = !flag;
        GPDSET(4, flag);
        Delay(GPIO_ReadInputDataBit(GPIOA, 1) ? 2000000 : 1000000);
    }
}

なんか
Visual Studio→Word→Bloggerオンラインエディタ
で張り付けると
文字の色が保持されるかわりに タブが恐ろしいことになるんだよね
なんでだろう?
'\t'の扱いがVCでは半角スペース4文字だけどBloggerエディタだと違う とかかな?
追々直しますヾ(゚Д゚ )ォィォィ
↑修正しました 一部アレだけど まぁ 我慢してください

で、なぜprintfが使えないか
個人的に 正解率1割以下の勘を信じると
おそらくstdoutが無いんじゃないかと
だって シリアル出力だけで5系統あるわけじゃないですか(多分
んで それ以外にも ユーザーが作った出力があるかもしれない
となると stdoutを決めておくより
あとで定義したほうが自由度が高い
ってことじゃないかと

まぁエラーメッセージ的にはまったく違う理由っぽいですが

とりあえず そんな感じです

うー めんどくさいなぁ OS使いたいなぁ(((

2012年4月7日土曜日

STBeeでLチカ

今さらながらに
STBeeでLチカやってみました
ポートの入力/出力です


#include "stm32f10x_conf.h"

#define GPDON(PIN) { GPIOD -> BSRR = _BV(PIN); }
#define GPDOF(PIN) { GPIOD -> BRR  = _BV(PIN); }
#define GPDSET(PIN, bit) { if(bit){ GPDON(PIN); }else{ GPDOF(PIN); } }

void Delay(volatile unsigned long delay)
{ while(delay) delay--; }

int main(void) {
    int flag;

    GPIO_InitTypeDef GPIO_InitStructure;
                  
    // システムを初期化します(外部水晶をONにし72MHz動作に切り替えます)
    SystemInit();
                  
    // GPIO A/Dポートのクロックを有効にします
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

    // PD.4ポートを出力にします。PD.4=LED Lowで点灯
    GPIO_InitStructure.GPIO_Pin = _BV(4);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure); // 初期化関数を読み出します。
                  
    // PA.0ポートを入力に
    GPIO_InitStructure.GPIO_Pin = _BV(0);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
                                    
    for ( ; ; ) {
          flag = !flag;
          GPDSET(4, flag);
          Delay(GPIO_ReadInputDataBit(GPIOA, 1) ? 1000000 : 2000000);
    }
}


開発環境はストリナで配布されてるモノ
ユーザースイッチが押されているか押されていないかで点滅周期が変わるプログラム

とりあえず入出力ができるようになったので
あとは割り込みとシリアル通信が出来れば
かなり色々と遊べる
タイマ割り込み/シリアル通信/ADCが出来れば 最低限の缶サットは作れるしなぁ

割り込みはめんどくさそうだし
とりあえずUSARTとADCを目指して
PIC飛ばす前にSTBee飛ぶかも?(缶サット