2014年12月21日日曜日

Stellaris LaunchPad で Energia を使ってみる。Stellaris LaunchPad with Energia.

以前、Stellaris LaunchPadのLチカをしてみましたが、Macだと、IAR EWARMが使えません。
ネットで調べてみると、Energiaと言う物が使えるらしいので、早速試してみます。
なんか、Arduinoっぽく、簡単に書けるみたいです。
I programed Stellaris LaunchPad before. But, IAR EWARM can't be used in Mac.
I searched for a web and i found a Energia. It's like a Arduino.


1.Download the Energia
   http://energia.nu/Guide_StellarisLaunchPad.html  のDownloadを押します。
   Press the button "Downlord" of http://energia.nu/Guide_StellarisLaunchPad.html .
OS X用dmgファイルをクリックします。


ファイルを保存をクリック。
Click the button "Save files".

ええっ?失敗しました?
Oh, was this failed?


気を取り直して、もう一度。今度はうまく行きました。
Try again.It's OK this time.

2.Install the Energia
dmgファイルをダブルクリックして解凍し、出来上がったアプリケーションをApplicationsフォルダにドラッグします。
An application is made, when dmg file is double-clicked.And drag it icon to application folder.

アプリケーションを起動すると、以下のダイアログが出ますので、開く。を押します。
When application is started, the following dialogue is indicated.A open button is pressed.

3.Run the Energia
ありゃりゃ。Arduinoと同じ画面じゃないですか?しかも最初から日本語化されてます。
でも、CPUがmsp430になってます。
Wow. The same screen as Arduino! Moreover it's Japanese localization.
But,CPU is MSP430.

ツール -> マイコンボード -> Stellarisを選びます。
You select TOOLS , Microcomputer board, and Stellaris.

4.An allocation of IO of the Stellaris on the Energia
さて、IOの割当はどうなっているでしょうか?
の写真を見ると、
PF_1     RED LED
PF_2     BLUE LED
PF_3     GREEN LED
となっています。まずは、これをLチカしてみましょう。
I investigated allocation of IO.The picture existed http://energia.nu/Guide_StellarisLaunchPad.html.
The onboard LED'S allocation is,
PF_1     RED LED
PF_2     BLUE LED
PF_3     GREEN LED
I turned on these LEDs.

5.Programing and run of blinking the LEDs.
以下のスケッチを書き込み、LaunchPadをUSBに差し込んで、書き込みボタンを押します。
You write in the following program.After connecting launchPAD to Mac, a Write button is pressed.


int i; // counter
void setup()
{
   // put your setup code here, to run once:
   pinMode(PF_1, OUTPUT); // RED LED
   pinMode(PF_2, OUTPUT); // BLUE LED
   pinMode(PF_3, OUTPUT); // GREEN LED
   Serial.begin(115200);  // Setup serial port
   i=0;
}
void loop()
{
   // put your main code here, to run repeatedly:
   digitalWrite(PF_1,HIGH); // Red
   delay(10);
   digitalWrite(PF_1,LOW);
   delay(10);
   digitalWrite(PF_2,HIGH); // Blue
   delay(10);
   digitalWrite(PF_2,LOW);
   delay(10);
   digitalWrite(PF_3,HIGH); // Green
   delay(10);
   digitalWrite(PF_3,LOW);
   delay(10);
   i++;
   Serial.print( int (millis()));  // Print system time ms
   Serial.print( "," );            // ,
   Serial.println(i);            // Print counter.
}



うわっ。簡単に動きました。ここまで、マニュアルも見ないで1時間弱で完了です。
念願のシリアルモニタも使えます。
Oh,That moved easily.I didn't read a manual.I'm working for only about 1 hour.
A serial monitor can use it, too.


簡単でしょ。
It's easy, isn't it?
Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする

2014年12月14日日曜日

8pino(Trinket)でデバッグするには? How to debugging for 8pino(trinket)

8pinoでは、シリアルモニターが使えません。シリアルモニターはデバッグするのにとても
大事な機能です。
せめて、大昔のマイコンボードの様に7SEGで内部データを16進表示させる事が出来れば
何とかなります。
手元にあった、7SEG表示器1個とHC4040バイナリカウンタで内部データを表示できる様
にしてみました。
8pino(Trinket) does not have a Serial port connection for debugging. 
Serial port monitor is the function important to do debugging.
An 7SEG LED display attached to an old microcomputer board. 
It indicated the inner data. 
I have one 7SEG LED and HC4040 binary counter. 
I made an 7SEG display using those.

HC4040はバイナリの12bitカウンタで、CLK入力の立ち下がりでカウント、RES入力の
立ち上がりでカウンタをリセットします。
これを使って7SEGLEDを点灯させるアイデアは大昔からあると思うので割愛します。例えば、
HC4040 is 12bit binary counter. It have CLK(clock) input and RESET input.
The idea that LED drive using it existed in that from the past. For example...

このプログラムは、アナログ入力1に取り付けた可変抵抗器の値(0〜3.3V、数値は0〜1023)
を16進にして、7SEGLEDに表示します。
但し一桁しか無いので、一桁ずつ、ゆっくりと表示させます。
例えば、可変抵抗器を最大にした時は1023=0x03FFとなりますので、
0 3 3 F - - - - 
と表示されます。- - - - と言うのは、データの区切りを示しています。
This program is display an analog input ch1 encoding hex data.  
It's indicated each one digit slowly.
For example in case of maximum voltage, it's indicate as follows,
0 3 3 F - - - - 
"- - - -" is data delimiter.

これを使えば、"少しは" デバッグが楽になります。
When this is used, debugging becomes easy. 
(Very little)



// 8pino 7segment drive test /w MC14040BCP
// Analogdata display
//
// [回路図 Circuit diagram]
// [8Pino]      [4040]         [LA-301VL]
// GPIO(1) ---> CLK
// GPIO(0) ---> CLR
//              Q0     -470R-> SEG a
//              Q1     -470R-> SEG b
//              Q2     -470R-> SEG c
//              Q3     -470R-> SEG d
//              Q4     -470R-> SEG e
//              Q5     -470R-> SEG f
//              Q6     -470R-> SEG g
// A/D(1)  ---> Triimer register
//
// バイナリカウンタを使った7セグメントLEDの駆動実験
// 指定のパルスを出す事により、各セグメントをスタティック点灯させる。
// 例えば、"1" を点灯させるには、SEG b と SEG c を点灯させる為に、2+4=6回パルス発生する。
// パルスを送る前に、CLRをHにしてカウンタをクリアしておく事。 
// A 7segment LED drive test with binaly counter.
// Drive on each segment at static state with several pulse signal.
// For example,When you'd like display a "1", you turn on SEG b and SEG c.
// Before sending a data pulse, you send a pulse to CLR.
// Define bacic binaly data
#define seg_A 1    //0000 0001
#define seg_B 2    //0000 0010
#define seg_C 4    //0000 0100
#define seg_D 8    //0000 1000
#define seg_E 16   //0001 0000
#define seg_F 32   //0010 0000
#define seg_G 64   //0100 0000
// Define 7 segment charactor
#define CHR_0 seg_A + seg_B + seg_C + seg_D + seg_E + seg_F + 0
#define CHR_1         seg_B + seg_C
#define CHR_2 seg_A + seg_B         + seg_D + seg_E         + seg_G
#define CHR_3 seg_A + seg_B + seg_C + seg_D                 + seg_G
#define CHR_4         seg_B + seg_C                 + seg_F + seg_G
#define CHR_5 seg_A         + seg_C + seg_D         + seg_F + seg_G
#define CHR_6 seg_A         + seg_C + seg_D + seg_E + seg_F + seg_G
#define CHR_7 seg_A + seg_B + seg_C
#define CHR_8 seg_A + seg_B + seg_C + seg_D + seg_E + seg_F + seg_G
#define CHR_9 seg_A + seg_B + seg_C                 + seg_F + seg_G
#define CHR_A seg_A + seg_B + seg_C         + seg_E + seg_F + seg_G
#define CHR_B                 seg_C + seg_D + seg_E + seg_F + seg_G
#define CHR_C seg_A                 + seg_D + seg_E + seg_F
#define CHR_D         seg_B + seg_C + seg_D + seg_E         + seg_G
#define CHR_E seg_A                 + seg_D + seg_E + seg_F + seg_G
#define CHR_F seg_A                         + seg_E + seg_F + seg_G
#define CHR_BAR seg_G
// Variable settings
int led = 1;  // On board LED (pin 1)
int vol = 1;  // Analog input 1(pin 2)
unsigned int vol_num;  // Analog value
int cnt;      // Counter
int res = 0;  // reset = #0
int value;    // output value
int max_value;
// Character dimensions
int CHR[] = {CHR_0,CHR_1,CHR_2,CHR_3,CHR_4,CHR_5,CHR_6,CHR_7,CHR_8,CHR_9,CHR_A,CHR_B,CHR_C,CHR_D,CHR_E,CHR_F,CHR_BAR};
int i;
// GPIO direction
void setup() {
   pinMode(led, OUTPUT); //4040 CLK pin(/w onboard LED)
   pinMode(res, OUTPUT); //4040 CLR pin
   //pinMode(vol, INPUT); // An analog input is default.
}
// 7segment drive
// 引数:キャラクタ配列の順番(0=0,1=1,2=2,....F=15,...)
// 戻り:なし
// 動作: 1)CLRパルスを出す。
//       2)キャラクタ配列の数値を取り出し、その回数のCLKパルスを出す。
//       3)500ms表示する。
// Arg:Number of character dimension.
// Ret:non
// Function:1)Send CLR pulse.
//          2)Read number of character dimension, and send pulse.
//          3)Display character between 500ms.
void disp_7seg( int disp_num){
   int max;                      //Quantity of the pulse
   max = CHR[disp_num];          //Set Q'ty of the pulse
   digitalWrite(res,HIGH);       //CLR on pulse
   delayMicroseconds(3);         //CLR on pulse time.
   digitalWrite(res,LOW);        //CLR off
   delayMicroseconds(3);         //CLR off time.
   delay(200);                   //Time of the turn off the light.
   for (cnt=0;cnt < max;cnt++){  //Loop on max times.
     digitalWrite(led,HIGH);     //Pulse on
     delayMicroseconds(3);       //Pulse on time.
     digitalWrite(led,LOW);      //Pulse off
     delayMicroseconds(3);       //Pulse off time.
   }
   delay(300);                   //Time of the display charactor.
}
// Divide data to 4 figure
// Arg:hex_data
// Ret:4th digit number
unsigned int dec2hex_4(unsigned int num){
   unsigned int result;
   result = num/0x1000;
   return result;
}
// Arg:hex_data
// Ret:3rd digit number
unsigned int dec2hex_3(unsigned int num){
   unsigned int result;
   result = (num-dec2hex_4(num)*0x1000)/0x100;
   return result;
}
// Arg:hex_data
// Ret:2nd digit number
unsigned int dec2hex_2(unsigned int num){
   unsigned int result;
   result = (num-dec2hex_4(num)*0x1000-dec2hex_3(num)*0x100)/0x10;
   return result;
}
// Arg:hex_data
// Ret:1st digit number
unsigned int dec2hex_1(unsigned int num){
   unsigned int result;
   result = num-dec2hex_4(num)*0x1000-dec2hex_3(num)*0x100-dec2hex_2(num)*0x10;
   return result;
}
// 7Segment Display 4 digit number.
// Arg:hex_data
// Ret:non
void seg_Display(unsigned int num){
   disp_7seg(dec2hex_4(num));        // Display 4th char.
   disp_7seg(dec2hex_3(num));        // Display 3rd char.
   disp_7seg(dec2hex_2(num));        // Display 2nd char.
   disp_7seg(dec2hex_1(num));        // Display 1st char.
   disp_7seg(16);       // Display ---
   disp_7seg(16);       // Display ---
   disp_7seg(16);       // Display ---
   disp_7seg(16);       // Display ---
}
void loop() {
// The 4 character display demonstration.
   vol_num = analogRead(1);    // Trrimer volume read.
   seg_Display(vol_num);        // Display 4 degit
   delay(1000);               // Wait
}

Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする

2014年12月7日日曜日

8pinoではtone()関数は使えない。The tone library does not work for the 8pino(Trinket).


8pino(Trinket)では、toneライブラリが使えません。
スケッチでtone()を使ってもコンパイルエラーは出ませんが、動作しません。
下記に、代替えのbeep()関数がありましたので、早速実験してみました。

The tone library does not work for the 8pino(Trinket).
If you compile the scketch in used tone library, it won't be an error.
A way of substitution existed in the following site.


このbeep()はdelayMicroseconds()を使って、かなり正確なbeepを実現していますが、deleyMicroseconds()の最大値が16383usなので、30Hz以下の周波数を出す事が出来ません。
そこで、60Hz以下の時はdelay()関数(ms単位)のタイマーを使う様に改造してみました。

This beep() used delayMicroseconds().This is correct timing.
But it's possible to use delayMicroseconds() only up to 16383us.
I edited a program to output less than 30 Hz of signal.

1Hzから1023Hzまで割と正確に出す事が出来ます。
It can output a correct signal from 1Hz to 1023Hz.

1Hz

1023Hz



// TONE TEST
// ボリュームに応じてTONE信号(1〜1023Hz)を出力 Make tone signal(1 to 1023Hz) with analog volume.
// 8pinoでは、TONE()が使えません。The tone library does not work for the 8pino(Trinket).

int led = 1;  // On board LED (pin 1)
int vol = 1;  // Analog input 1(pin 2)
int vol_num;  // Analog value

void setup() {
  pinMode(led, OUTPUT);
  //pinMode(vol, INPUT); //Default pin mode is analog input.
}

void loop() {
  vol_num = analogRead(vol);     //Read analog data (0 to 1024)
  if (vol_num == 0) {            // if f=0Hz then 
    vol_num = 1;                 //   f=1Hz
  };
  if(vol_num > 60){              //  if f>60Hz then
    beep(led,vol_num,1000);      //    use delayMicroseconds()
  }else{                         //  else
    beep_ms(led,vol_num,1000);   //    use delay()
  }
}

void beep (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
  int x;    
  long delayAmount = (long)(500000/frequencyInHertz);   // Original is 1000000
  long loopTime = (long)((timeInMilliseconds*1000)/(delayAmount*2));
  for (x=0;x<loopTime;x++)    
  {    
  digitalWrite(speakerPin,HIGH);
  delayMicroseconds(delayAmount);
  digitalWrite(speakerPin,LOW);
  delayMicroseconds(delayAmount);
  }    
}

void beep_ms (unsigned char speakerPin, int frequencyInHertz, long timeInMilliseconds)
  int x;    
  long delayAmount = (long)(500/frequencyInHertz);   // Original is 1000000
  long loopTime = (long)((timeInMilliseconds)/(delayAmount*2));
  for (x=0;x<loopTime;x++)    
  {    
  digitalWrite(speakerPin,HIGH);
  delay(delayAmount);
  digitalWrite(speakerPin,LOW);
  delay(delayAmount);
  }    
}




Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする