2014年9月28日日曜日

ロウソクランタンとペルチェで発電システムの考案(2)

http://ivis-mynikki.blogspot.jp/2014/09/blog-post.html
の続き。


ペルチェ2枚から今度は4枚平たく2x2マスになるように並べて4V以上の電圧が出ないかテストしてみた。

以下の事を一通りやってみた。
・ペルチェ1枚でどのくらいの電圧がでるか。・ペルチェ2枚を並列・直列に繋いで見てどうへんかするか。
・ペルチェ4枚を直列に繋いで4V以上の電圧がでるのか。

結論からすると、直列にしても並列にしても特性は同じという事を確認できた。
あとペルチェは1つ辺り0.1Wだと思った方がよくて4枚使えば4倍の0.4Wになる。
これが使い物になるのかという疑問に行き着く。

それでも何とかならないか試してわかった事は、
・ペルチェに伝える熱の伝達は良くしておくことは鉄則。
・ペルチェは薄いので、温度差が取りづらい。
・温度差は熱源の温度ではなく均衡状態になったときの温度差がいくらか。

 最初から分かるようなことだけど、温度差を稼ぐ事がいかに難しいかを思い知らされた今日であった。

次回は今回の実験結果をまとめる。


2014年9月26日金曜日

ロウソクランタンとペルチェで発電システムの考案

ロウソクランタンの熱で発電ができないかやってみた結果をまとめておく。

下の写真は今回作ったIntelのCPUヒートシンクにペルチェを2枚直列にくっ付けたもので発電してる様子。


2200mAのリチウムバッテリーも充電しながらスマホも充電できたので熱発電は案外と楽で
このときの発電量は昇圧型のDCDCコンバーター(効率80%)を使って5V100mA、電力にすると0.5W。

スマホを充電するには5V1000mA必要とされてるのであと10倍パワーが欲しくなる。

どう考えても発電量・経済的にソーラーパネルのが効率がよいが
ロマン()を求めてスマホ充電できる所までがんばってみる。

今回の購入品
・ペルチェ2枚
・ヒートシンク
・DCDCコンバーター

合計2500円くらい

わかった事
・ペルチェ1枚辺りの発電量は0.5W
・温度差が60~80度で約1Vで0.5Wが得られる
・温度差100度になればおおよそ0.8W
・発熱<吸熱の関係なら2枚重ね直列は不要
・熱伝対の特性どおり温度差と電圧は比例の関係
・2枚重ねしても発電量は変わらない
・DCDCコンバーターかけてリチウム電池を充電するなら最初から5V電源を作る
・100円均一のロウソク1つはおおよそ3時間で燃焼する
・A3サイズのソーラーパネル80W@8000円のを買えば急速充電ができる(晴天にかぎり)
・1枚@700円で4枚買うと2800円。10000mAのバッテリー1つと同じ値段。
・熱効率だけを考えればスターリングエンジンのがよい。

色々思うところはあるが、次回は4枚並列に並べてDCDCコンバータを使わずに電圧5V得られるようにすること。
理論上は1V500mA*4枚*(100/80)効率=2W*1.25=2.5Wになるので、PCのUSBポートと同じ電力が得られるので、(危ないけど)直接スマホを充電できるところまでがんばってみようと思う。


2014年9月19日金曜日

Reactive Extensions for .NET (Rx) 入門その1

いろんなサイトを見ても良く分からなかく避けていたのですが、
最近になってRxのカケラのようなものが分かってきたのでまとめておきます。
前提知識としてLinQの使い方が分かっていないと理解が難しいと思います。

・Rxについて
 まず、Rxとは何?ですが、
どのサイトでも紹介されているようにIEnumerable「Pull型」の反対がObservable「Push型」にあたります。
何をPush?Pull?かというと、これはデーターフローの事で
与えられた入力データを引っ張る、もしくは押していくかの違いになります。
 ここで出てきたPull型とPush型については以下のとおりです。

・Pull型とは
 ある空間からデータを引っ張ってくる(戻り値で受け取る)イメージです。まさにforeachがそれ。

例: 配列から1つ値を引っ張ってきて処理する。
var query = new List() { 1, 2, 3, 4, 5 }.Select(i => { return i; });
foreach(var i in query)
{
  Console.WriteLine(i); //ひっぱってきた値を処理する。
}

・Push型とは
 得られたデータを左から右へと押していく、一言で言えばメソッドチェーン。
 しかもインターフェイスがObservableが同一であれば自在に操作ができる。

例: 値を左から右へ伝播させて処理する。
var query = Observable.Range(1, 5);
query.Subscribe(i => { Console.WriteLine(i); }); //伝播されてきた値を処理する。

2つは似ていても入力データの処理方法が異なる事が分かったでしょうか。
もう1つ大きな違いは、
Pull型は値を引っ張ってきて同メソッド内で処理を行いますが、
Push型は、Observerがこんな入力データが来ましたよと、(丸投げ)通知するので、実質処理は外側にいるクラスで行います。


入力データにフィルタを書けたり加工したりするのはLinQ機能で実現できるので、
応用処理はどちらも同じくらい広がりますね。

最後に
 データと処理を一箇所にまとめてコンパクトにしたい場合はIEnumerableが得意とされ
 データと処理を分離して、1つのデータで異なる処理をまとめて実行したい場合はObserverbleが得意とされるようです。


次回はもう少し実例を使って違いを見比べてみたいと思います。

2014年8月3日日曜日

LINEの裏技

人気になっているLINEアプリでどんな裏技があるか調べてみた。
 NAVERまとめ
http://matome.naver.jp/odai/2134693530669110101

・LINEでブロックされているか正確に知る方法
 ブロックされていなければ、スタンプがプレゼントできる。

・既読をつけないでトークを読む
 メッセージ受信した後に、機内モードに切り替えるとネットワークに繋がらない状態になるので、機内モードにしてからメッセージを開く。
 ネットワークが繋がると既読が付いてしまうので、LINEアプリを終了してから機内モードをOFFにする。
 LINEアプリを起動するまで未読状態が続く。

・LINEを起動せずにメッセージを読む
 通知設定をONにしておくとプッシュ通知される。

・文章の最初にある記号をつけると太字になる
 先頭に半角の*を付けると太字になる。

・トークの背景画像を変更する
 トークの背景画像を変更するには、「設定 > トークルーム設定 > 背景デザイン」から変更する。デフォルトの背景かアルバムから選べる。その場でカメラで撮った写真も設定可能。

・知らない人からのID検索をブロックする
 設定 > プロフィール > 「IDの検索の許可」をオフにする(もしくはチェックボックスを外す)

・自分のLINEアカウントをURLにして相手に知らせる
 「QRコード > QRコード表示」

・LINE 通訳機能を使う
 トーク中に、日本語⇔英語、日本語⇔中国語、日本語⇔韓国語の同時通訳が可能

・LINE お天気を使う
 ”友だち追加”から「LINEお天気」を友だちに追加

Microfost Office (2010 / 2013)の試用期限をリセットする方法


①猶予期間のリセットには管理者権限が必要なので、
[すべてのプログラム]→[アクセサリ]→[コマンドプロンプト]を右クリックして、
[管理者として実行]を選択

②ライセンス認証フォルダに移動
>cd  ¥Program Files¥Common Files¥Microsoft Shared¥OfficeSoftwareProtectionPlatform

 Office2013の場合は、
  C:\Program Files (x86)\Microsoft Office\Office15
③ライセンス猶予期限のリセット
>ospprearm.exe
と入力すると、
「Microsoft Office rearm successful.」等と表示される
この方法は5回まで可能。

イメージを取得するまで、Office アプリケーションを開いたり、ospp.vbs を実行したり
しないでください。KMS ホストを使用して Office 2010 のライセンス認証を行わない限り、
5 回まで猶予期限をリセットできます。猶予期限のリセット回数が足りなくなった場合は、
KMS ホストを使用してライセンス認証を行うことによって、猶予期限を 1 回リセットできます。

http://technet.microsoft.com/ja-jp/library/cc178964.aspx


こういったアプリは、アンインストールしたいのにレジストリか何か変更を加えたままにしてしまい、気持ち悪いので、完全アンインストールするアプリというのもある。
どんなソフトでも完全にアンインストールできるアプリ

どんなソフトでも完全にアンインストールできるアプリ

このアプリをインストールしてから

評価版のソフトウェアをインストールしたりなんかするとパソコンに何か書き換えた情報を残してを完全に消えてくれないのでいつもモヤモヤする人におススメアプリである。

Comodo Programs Manager

このソフトは日本語には対応してないけども、使い方さえ覚えておけばいいので、メモを残しておく。

1.インストール
 Comodo Programs Manager
 をダウンロードして、言語はEnglishを選択してインストールする。
 途中EMailの入力が求められるが、これは任意なので入力せずNextを押してインストールを終わらせて再起動する。

2.任意のソフトを完全アンインストール方法
 デスクトップ上にあるCOMODO Programs Managerを起動する。
 左側のメニューからProgramsを選択すると、インストーラでインストールしたソフトウェア一覧が表示される。
 この中からアンインストールしたいソフトウェアを選ぶと、
  COMODO Programs Managerを
    インストール前に入れたソフトはStandard Uninstaller
    インストール後に入れたソフトはComplate Uninstaller

 というように表示が異なるが、
 Standard Uninstallerの場合は、通常アンインストーラーが起動して、
 Complate Uninstallerの場合は、変化したレジストリなどをスキャンが始まるが、スキャン完了後にComtinueを押せばOK。

2014年7月30日水曜日

テキストで作れるUML「PlantUML」

テキストで書けるUMLを見つけた。 http://plantuml.sourceforge.net/ 最終的にはdoxygenなどに埋め込んでドキュメント化ができるみたいだけど、 書き方になれるまでは専用エディタを使ってからのがよさそうだ。 https://code.google.com/p/plantumleditor/ こういうツールってソースコードを最初に書いて、 最後にできたものが設計書になるという便利なものだが 忘れがちになるのが設計フェーズを飛ばしてコーディングからスタートして 作り直しが発生して最終成果物がアウトプットされるまでにかかる時間コストが 増えてしまいがちになるので、設計はコーディングとは別作業にすべきと思う。

2014年7月1日火曜日

XML電文の解析、作成方法

XML電文のやり取りを行う方法。 Modelクラスを作ってシリアライズ、デシリアライズを行って、 パースエラーの例外を受信エラーとすればよい。
            model obj = new model();
            obj.id = 1;
            obj.name = "test";
            obj.param = new List();
            obj.param.Add(new data() { pos = 0, vol = 0 });
            obj.param.Add(new data() { pos = 1, vol = 1 });
            XmlSerializer serializer = new XmlSerializer(typeof(model));
            using(var fs = new FileStream(@"c:\temp\test.xml", FileMode.Create, FileAccess.Write))
            using(var sw = new StreamWriter(fs, Encoding.GetEncoding(932)))
            {
                serializer.Serialize(sw, obj);
            }
            using (StreamReader sr = new StreamReader(@"c:\temp\test.xml"))
            {
                model _model = (model)(serializer.Deserialize(sr));
            }
XML電文
<?xml version="1.0" encoding="shift_jis"?>
<model xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <id>1</id>
  <name>test</name>
  <param>
    <data>
      <pos>0</pos>
      <vol>0</vol>
    </data>
    <data>
      <pos>1</pos>
      <vol>1</vol>
    </data>
  </param>
</model>

2014年5月10日土曜日

rasbbery pi で音を鳴らす

組込み用途で使用する時って画面が無いから、起動シーケンスが終わった後にピーってビープ音か何か欲しくなるので調べてみた。

1.まず必要なユーティリティーをインストール。
$ sudo apt-get install -y alsa-utils mpg321 lame mplayer


2.snd-bcm2835が入っているかチェックする。
$ lsmod

入ってなければ
>sudo modprobe snd-bcm2835


3.鳴らすポートの選択。今回はアナログを選んだ。
$ numid= { 0=auto, 1=analog, 2=hdmi }

$ amixer cset numid=3 1


4.音が鳴るか確認。

サイン波
$ speaker-test -t sine -f 440 -c 2 -s 1

Wav音源
$ wget http://www.jahozafat.com/0093058674/WAVS/Movies/Full_Metal_Jacket/numnuts.wav

MP3音源
$ wget http://www.hmix.net/music/c/c3.mp3
$ mpg321 c3.mp3


M4A音源
$ mplayer test.m4a



 5.ボリューム調整
$ amixer cset numid=1 -- 80%


6. WAV→MP3変換をしてみる
$ lame numnuts.wav numnuts.mp3


おもちゃみたいな基板から音楽が流れるとちょっとだけ感動する。。

 
参考サイト
http://jeffskinnerbox.wordpress.com/2012/11/15/getting-audio-out-working-on-the-raspberry-pi/



2014年5月2日金曜日

SPI通信の導入式

SPI通信で遅れて1ビットずれてしまい、1日悩んだ。SPI通信の仕様をちゃんと読まなかったからだ。

今回はちゃんと読んで理解した内容を忘れないようにメモを残しておく。

覚えておくこと。
・マスター・スレーブ間の通信である。(当たり前)
・配線は5本、CLK、MISO、MOSI、CE、GND
・MISO(Master In Slave Out)、
・MOSI(Master Out Slave In)

スレーブ側はIC仕様によって異なるので、例としてL6470の場合、

  →立上りで入力(MISO)
  →立下りで出力(MOSI)

という仕様である。
これを端子名 MISO、MOSIと書いた部分に注目!
MasterとSlaveは入出力が反対になるのがSPIの特徴である。

ディジーチェーン2つ繋いだ構成でSPI通信を行うとき
4バイト送ったら最初の2バイトがマスターに届けられてないといけない。

これを考えると、クロックのタイミングは
 MISO、MOSI MISO、MOSI MISO、MOSI MISO、MOSI、、、、

こういう順番と

 MOSI、MISO、 MOSI、MISO、 MOSI、MISO、 MOSI、MISO、、、、

どっちが正しいか。

考えれば最後に出力になっていないと、前者だと1ビット欠落してしまう状態になる。(←ここではまった)

要するにCLKの論理は、スレーブの仕様によって決まって、
 マスターのデータ取り込みタイミングは、MISOになるように設定する。

L6470の例だと、
 ・データを取り込み(MISO)は立ち上がり
  ・MISOが最後にした場合、CLKエッジはHIGHで終わるので負論理(^CLK)

波形が乗っているサイトの見てみると、
https://www.diolan.com/dln_doc/spi-transfer-modes.html

CPOL=CLKエッジ最後の状態 ・・・ HIGHなので CPOL=1
CPHA=CLK取り込み開始状態 ・・・ HIGH(HIGH→LOW)なのでCPHA=1
 
Mode=|CPOL|CPHA|のビットアサインなので、


Mode=11 =(3) Mode=3

2014年4月30日水曜日

[Win7][Win8]インターネット接続の共有のIPアドレスの設定方法

インターネット接続の共有で設定されるIPアドレスを変えようと思って調べたら
WinXP時代とはレジストリの配置が異なっているので気をつけないといけないようだ。


[XPまで]
 Hkey_Local_Machine\System\CurrentControlSet\Services\ICSharing\Settings\General

[XP以降]
 Hkey_Local_Machine\System\CurrentControlSet\services\SharedAccess\Parameters

 名前がわかりやすくなったのだけど、なかなか気づけないよこれは。

 以下引用
-----

ホストとの接続の共有ホストの DHCP サービスで使用される IP アドレスの範囲に割り当てられている IP アドレスを変更するにはレジストリ エディターを使用して、次の値を変更します。これらの値は、次のフォルダーに配置されます。
HKLM\System\CurrentControlSet\services\SharedAccess\Parameters

    (REG_SZ)ScopeAddress
    (REG_SZ)StandaloneDhcpAddress

ScopeAddress 値は接続の共有で使用するアドレスの範囲を設定します。StandaloneDhcpAddress 値は、SoftAP と仮想の Wi-Fi が有効になっているときに使用されるアドレスの範囲です。両方の値をネットワーク マスク 255.255.255.0 を使用しは構成できません。

----

参考元URL: http://support.microsoft.com/kb/230148/ja

2014年4月23日水曜日

skypeの広告を消す方法

Skypeを起動して、

 表示→コンパクトビューをクリック。

 ツール→設定→通知→アラート&メッセージ→メッセージを表示の2個のチェックボックスを外す→Skype再起動

インターネットオプションを開いて、
 セキュリティ→制限付きサイト→サイト→[https://apps.skype.com]を追加。

以下のテキストを書いたバッチファイルを作成して管理者として起動する。
 echo 127.0.0.1 cdn.adnxs.com>> C:\Windows\System32\drivers\etc\hosts
 echo 127.0.0.1 m.adnxs.com>> C:\Windows\System32\drivers\etc\hosts
 echo advertising.jp.msn.com>>  C:\Windows\System32\drivers\etc\hosts


これで画面がすっきりする。

更新
2015.04.01

エイプリルフールだけど気にしないで!

広告枠も削除する方法が乗っていたので追記。

C:\users\(ユーザー名)\AppData\Roaming\Skype\(アカウント名)\config.xml

を開いて

<AdvertPlaceholder>1</AdvertPlaceholder>

行を削除する。

これでおk。

---

Control Panel -> Internet Options -> Security -> Restricted Sites -> Sites -> add g.msn.com and apps.skype.com

Also, to remove the ad placeholder, go to your 
C:\users\youruser\AppData\Roaming\Skype\yourskypeuser\config.xml

and find the line 1

<AdvertPlaceholder>1</AdvertPlaceholder>

and remove the line completely

---


2014年4月14日月曜日

VB.NET LinqでGroupByの使い方

いつも使い方を忘れるのでメモ。 サンプルは、List型の配列、Dictionary型でGroupByする時の例。
    Public Class pmodel
        Public key As Integer = 0
        Public dat As String = ""

        Public Sub New(k As Integer, d As String)
            key = k
            dat = d
        End Sub
    End Class
    Private models As New List(Of pmodel)
    Private dic As New Dictionary(Of Integer, pmodel)


    Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
        models.Clear()
        models.Add(New pmodel(0, "A"))
        models.Add(New pmodel(0, "B"))
        models.Add(New pmodel(1, "C"))
        models.Add(New pmodel(2, "D"))
        models.Add(New pmodel(5, "E"))
        Dim dat1() As IGrouping(Of Integer, pmodel) = models.GroupBy(Function(zz As pmodel) zz.key).ToArray()
        For Each dat As IGrouping(Of Integer, pmodel) In dat1
            For Each d In dat
                Console.WriteLine(String.Format("key={0}, k={1}, v={2}", dat.Key, d.key, d.dat))
            Next
        Next
''' >>>key=0, k=0, v=A
''' >>>key=0, k=0, v=B
''' >>>key=1, k=1, v=C
''' >>>key=2, k=2, v=D
''' >>>key=5, k=5, v=E
''' 

        dic.Clear()
        dic(0) = New pmodel(0, "AA")
        dic(1) = New pmodel(1, "AA")
        dic(2) = New pmodel(2, "BB")
        dic(3) = New pmodel(3, "CC")
        dic(5) = New pmodel(5, "DD")

        Dim dat2() As IGrouping(Of String, pmodel) = dic.Values.GroupBy(Function(d As pmodel) d.dat).ToArray()
        For Each dat As IGrouping(Of String, pmodel) In dat2
            For Each d In dat
                Console.WriteLine(String.Format("key={0}, k={1}, v={2}", dat.Key, d.key, d.dat))
            Next
        Next

    End Sub
''' >>>key=AA, k=0, v=AA
''' >>>key=AA, k=1, v=AA
''' >>>key=BB, k=2, v=BB
''' >>>key=CC, k=3, v=CC
''' >>>key=DD, k=5, v=DD

Androider