2011年5月28日土曜日

HDD 他


こんな感じになった
ただ最近写真は全部MBPで取り込んでるから
地デジチューナーでも付けない限り1Tの方は使わないかな
でもMBPだってHDD多いわけじゃないから
移動するなりは必要だろうし
どうするか

SSDには多少ファイル入ってるけどIEのキャッシュに使ってる

2011年5月19日木曜日

サクっとTwitterに定期ポストする

とうとう自分にもTwitterで迷惑DMが回ってきた
一応Twitterでも7人の法則(?)を確認できた ということでよしとしよう

しかしそれを自分が拡散させていないと自信を持っていうことはできなかった

ということで警告をしたいが1回したところで確実に見ない人がいるだろう
だからといって1時間とか2時間とかごとにつぶやくのもめんどくさい
ということでC#で自動化してみた

用意するのは TweetConsole っていう
C#で扱いやすいツイッタークライアント
予めoAuth認証させておく必要があるので注意
以下Visual C# 2010 Eeで書いたコード

using System;
using System.Diagnostics;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        int min = 59;
        int sec = 59;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            sec--;
            label1.Text = min + ":" + sec;
            this.Text = min + ":" + sec;
            if (sec <= 0)
            {
                sec = 59;
                min--;
            }
            if (min <= 0)
            {
                min = 59;
                tw();
            }
        }

        private void tw()
        {
            Random ran = new Random();

            Process proc = new Process();
            proc.StartInfo.FileName = @"C:\Users\John\Downloads\TweetConsole\twtcnsl.exe";

            proc.StartInfo.Arguments =
                "/t 【お知らせ】このアカウント(rian_y)から「Hey, Ijust…」で始まるDMを受け取った場合開かずに消去してください(拡散型の迷惑DMです)【定期】 // >" + DateTime.Now.ToString();
            proc.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            min = int.Parse(textBox1.Text);
        }
    }
}

こんな感じになる
@"C:\Users\John\Downloads\TweetConsole\twtcnsl.exe"
の部分と
【お知らせ】このアカウント(rian_y)から「Hey, Ijust…」で始まるDMを受け取った場合開かずに消去してください(拡散型の迷惑DMです)【定期】 // >" + DateTime.Now.ToString();
は適当に書き換えて欲しい
ちなみに1時間ごとにpostするので
寝てる時とかに連投にひっかかると困るので
最後に時間を追加している

会話ボットを作るのは大変だけど
定時postボットなら上記のように簡単につくることが可能だ

いざという時は便利かもしれない
イベント告知とか

2011年5月9日月曜日

電波時計を作る(方法だけ)

Netduinoで電波時計を作ってました

何故かWinがNetduinoを認識しなくなったので要点をいくつか書くだけにしておきます
覚書

まず受信モジュール
40kHzを受信して〜というのは結構めんどくさいので
トライステートの電波時計V2の受信モジュールを使います

あれあるのになんで作るのかと
大した理由はなく暇つぶし的な

ちなみにWebで公開されている回路図と実際の基板のシルクが違うので注意してください

最低限必要なのは
電源(9V〜20V程度)
です
あとは5Vや3Vをフォトカプラに入れれば3進のパルスが出てきます

これを50ms程度の割り込みで監視して
3種類に分けて
60この配列に入れてやれば準備完了

あとはひたすらifで足し算していくだけ
Netduinoが復活したらコード載せます


/* ********* */

何故かBloggerのエディタがロードできない
旧エディタにして書いてる

2011年5月3日火曜日

ArduinoでLED制御

昨日のアレをArduinoで制御してみようと思い立った
理由は簡単
PICが思い通りに動いてくれなかった どこにバグがあるかわからない
ということでArduino
いちおう機械語のはずだし必要速度は出てくれるだろうと予想

んで



/*

pin2 = TC74HC4511AP A
pin3 = TC74HC4511AP B
pin4 = TC74HC4511AP C
pin5 = TC74HC4511AP D

pin8 = TC74HC238AP A
pin9 = TC74HC238AP B
pin10 = TC74HC238AP C

*/
boolean SEG[44];

void setup() {
int i = 2;
pinMode(i, OUTPUT); i++;
pinMode(i, OUTPUT); i++;
pinMode(i, OUTPUT); i++;
pinMode(i, OUTPUT); i = 8;
pinMode(i, OUTPUT); i++;
pinMode(i, OUTPUT); i++;
pinMode(i, OUTPUT); i = 0;
pinMode(13, OUTPUT);

SEG[i] = false; i++; SEG[i] = false; i++; SEG[i] = false; i++; SEG[i] = false; i++; // 0
SEG[i] = true; i++; SEG[i] = false; i++; SEG[i] = false; i++; SEG[i] = false; i++; // 1
SEG[i] = false; i++; SEG[i] = true; i++; SEG[i] = false; i++; SEG[i] = false; i++; // 2
SEG[i] = true; i++; SEG[i] = true; i++; SEG[i] = false; i++; SEG[i] = false; i++; // 3
SEG[i] = false; i++; SEG[i] = false; i++; SEG[i] = true; i++; SEG[i] = false; i++; // 4
SEG[i] = true; i++; SEG[i] = false; i++; SEG[i] = true; i++; SEG[i] = false; i++; // 5
SEG[i] = false; i++; SEG[i] = true; i++; SEG[i] = true; i++; SEG[i] = false; i++; // 6
SEG[i] = true; i++; SEG[i] = true; i++; SEG[i] = true; i++; SEG[i] = false; i++; // 7
SEG[i] = false; i++; SEG[i] = false; i++; SEG[i] = false; i++; SEG[i] = true; i++; // 8
SEG[i] = true; i++; SEG[i] = false; i++; SEG[i] = false; i++; SEG[i] = true; i++; // 9
SEG[i] = false; i++; SEG[i] = true; i++; SEG[i] = false; i++; SEG[i] = true; i++; // 10

digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
}

void loop() {
for (int i = 0; i <= 10; i++) {
SetSeg(i);
digitalWrite(13, false);
delay(250);
digitalWrite(13, true);
delay(250);
}
}

void SetSeg(char c) {
int i = (c * 4);
digitalWrite(2, SEG[(0 + i)]);
digitalWrite(3, SEG[(1 + i)]);
digitalWrite(4, SEG[(2 + i)]);
digitalWrite(5, SEG[(3 + i)]);
}


というところまでできた
ビットシフトとか使えばもっと簡単だけど
めんどくさいしあまり推奨されてないのでこのような感じ
boolean型で配列を作って
それを代入する
本来7セグメントデコーダとか使わないときに使う手法
Arduinoの場合ピン数が少ないから7セグLEDを使うことは少ないけど
あの奇っ怪な配置をやるのは意外と便利
もっといい方法もあると思うけど
基本的にC語なら何でも使えるから多用してる

あとなんでかHTMLにコピーというのができないんだよなぁ

2011年5月2日月曜日

ちょっと大きめな数字表示ディバイス

↑のようなのを作ってみた
秋月で売ってる16セグメントLEDを使った物

Netduinoの動作速度の問題でだいぶチラついて見える

部品リスト
16segLED 4個
4回路入りフォトカプラ 2個
TC74HC4511AP 1個
TD62003AP 1個
サイリスタ 4個
抵抗各種 相当数
Netduino

あとジャンパワイヤとか細々と

Netduinoはコード書くのが簡単で試作に便利
問題は動作速度があまり早くないという問題
ミリ秒単位の動作はできません
気が向いたらちゃんとPICで作って基板に載せます

2011年5月1日日曜日

Netduinoでシリアルポート

とりあえずNetduinoで使える機能を紹介するこのコーナー(?)

まずはシリアルポート
デバッグなら
Debug.Print("hello world");
でも十分だけど
シリアルポートを実際に使うのは多いはず

まずは参照設定に
Microsoft.SPOT.Hardware.SerialPort
を追加します
ソリューションエクスプローラーの参照設定を右クリックして「参照の追加」
出てきたウインドウの「.NET」タブから追加します

そしてプログラム先頭の方に
using System.IO.Ports;
を書き加えます

そしたら適当なところ(「public static void Main()」 の上あたり)に
static private SerialPort serial;
を追加
そしてMain()の適当なところ(最初のほう)に

serial = new SerialPort(SerialPorts.COM1, 9600,
                Parity.None, 8, StopBits.One);
を書き加えます
この設定だと
ビットレート9600
ストップビット1
パリティ無し
という一般的な設定になります

SerialPorts.COM1の場合Digital I/O 0ピンが受信 1ピンが送信
COM2の場合2ピンが受信 3ピンが送信になります
COM1とCOM2は同時に使うことができるので
COM2でGPSから緯度と経度を追加して
COM1でアナログから得た温度データ等と共にPCに送信
ということも可能です

そしてシリアルポートの設定が済んだら.Net Fullと同じように
serial.Open();
で接続を開始します(ピンに何もつながっていなくても接続です TCP等とはちょっと違う 「相手がいる前提」です)

これで通信することが可能です

ただ
serial.Print("hello world");
とやりたいところですが

Print関数が使えないみたいなので


        static private byte[] Print(string text)
        {
            byte[] da = new byte[text.Length];

            for (int i = 0; i < text.Length; i++)
            {
                da[i] = (byte)text[i];
            }

            return da;
        }


というのを作って

            string text = "Hello world";
            serial.Write(Print(text), 0, text.Length);
のように送信したりします(Printの中で送信することもできますが)


受信はまた機会があったらやろうと思います

NetduinoでLCD

using System.Threading;
using Microsoft.SPOT.Hardware;

namespace NetduinoApplication1
{
    class LCD
    {
        private OutputPort pinRS;
        private OutputPort pinRW;
        private OutputPort pinE;
        private TristatePort[] pinDB;

        public LCD(
            Cpu.Pin RS, Cpu.Pin RW, Cpu.Pin E,
            Cpu.Pin DB4, Cpu.Pin DB5, Cpu.Pin DB6, Cpu.Pin DB7)
        {
            pinRS = new OutputPort(RS, false);
            pinRW = new OutputPort(RW, false);
            pinE = new OutputPort(E, false);
            pinDB = new TristatePort[4];
            pinDB[0] = new TristatePort(DB4, false, false, Port.ResistorMode.PullUp);
            pinDB[1] = new TristatePort(DB5, false, false, Port.ResistorMode.PullUp);
            pinDB[2] = new TristatePort(DB6, false, false, Port.ResistorMode.PullUp);
            pinDB[3] = new TristatePort(DB7, false, false, Port.ResistorMode.PullUp);
            pinDB[0].Active = true;
            pinDB[1].Active = true;
            pinDB[2].Active = true;
            pinDB[3].Active = true;

            Thread.Sleep(100);

            init();
        }

        private void init()
        {
            Thread.Sleep(100);
            S4B(0x30);
            Thread.Sleep(5);
            S4B(0x30);
            Thread.Sleep(1);
            S4B(0x30);
            Thread.Sleep(1);
            S4B(0x20);
            Thread.Sleep(1);
            S8B(0x28);
            Thread.Sleep(1);
            S8B(0x08);
            Thread.Sleep(1);
            S8B(0x01);
            Thread.Sleep(1);
            S8B(0x06);
            Thread.Sleep(1);

            S8B(0x0C);
            Thread.Sleep(1);
            S8B(0x41, true);

            Clear();
            Thread.Sleep(10);
            Print("hello");
        }

        public void Clear()
        {
            S8B(0x01);
        }

        public void Print(string text)
        {
            byte[] da = new byte[text.Length];

            for (int i = 0; i < text.Length; i++)
            {
                da[i] = (byte)text[i];
            }

            Write(da, 0, da.Length);
        }

        private void Write(byte[] buffer, int offset, int count)
        {
            for (int i = offset; i < count; i++)
            {
                S8B(buffer[i], true);
            }
        }

        public void S8B(byte cmd, bool RS = false, bool RW = false)
        {
            pinRS.Write(RS);
            pinRW.Write(RW);
            pinDB[0].Write((cmd & 0x10) != 0);
            pinDB[1].Write((cmd & 0x20) != 0);
            pinDB[2].Write((cmd & 0x40) != 0);
            pinDB[3].Write((cmd & 0x80) != 0);
            pinE.Write(true);
            pinE.Write(false);

            pinDB[0].Write((cmd & 0x01) != 0);
            pinDB[1].Write((cmd & 0x02) != 0);
            pinDB[2].Write((cmd & 0x04) != 0);
            pinDB[3].Write((cmd & 0x08) != 0);
            pinE.Write(true);
            pinE.Write(false);
        }

        private void S4B(byte cmd,bool RS = false,bool RW = false)
        {
            pinRS.Write(RS);
            pinRW.Write(RW);
            pinDB[0].Write((cmd & 0x10) != 0);
            pinDB[1].Write((cmd & 0x20) != 0);
            pinDB[2].Write((cmd & 0x40) != 0);
            pinDB[3].Write((cmd & 0x80) != 0);
            pinE.Write(true);
            pinE.Write(false);
        }
    }
}

NetduinoおよびNetduino Plusで動作可能
Mainとかで

LCD lcd = new LCD(
                Pins.GPIO_PIN_D4, Pins.GPIO_PIN_D5, Pins.GPIO_PIN_D6,
                Pins.GPIO_PIN_A2, Pins.GPIO_PIN_A3, 
                Pins.GPIO_PIN_A4, Pins.GPIO_PIN_A5);
とかを実行してやれば
4ビットモードのリードライト対応です
ただまだリードは実装してない
new LCDの時点でピンを設定してやって自動的に初期化もされるので
Print("hello world");
とか実行してやれば文字表示ができます

もうちょっと機能追加して回路図とうpするかな
需要があるなら…