mbed

2月20日ころに秋月電子さんでSTM32 Nucleo Board STM32L476RGというマイコンボード(開発/評価ボード)を見つけました。

Arduino UNO R3と互換の外部拡張コネクタを備えています。(ARM32bit,最大80MHz)1600円

https://developer.mbed.org/platforms/ST-Nucleo-L476RG/

 

Nucleoの使い方が記載されたサイトを見つけました。

http://www.rs-online.com/designspark/electronics/jpn/knowledge-item/stm32-nucleo-board-highly-affordable-development-kit

 

初めてmbedを使用する方へ
http://www.rs-online.com/designspark/electronics/jpn/blog/JPN-mbed-first-running

 

探せば、いろいろためになる情報が見つかります。

http://blog.goo.ne.jp/sirius506/c/48ea07586ec23215a7a3111c820433c2

 

これは一番最初に見つけた使い方

https://developer.mbed.org/users/nxpfan/notebook/lets_get_started_jp/

 

ARMmbedのHPの中にもいろいろ有益な情報が入っています。

HandBookはリファレンスかな?すべて英語なのでGoogle翻訳のお世話になります。

私家版の日本語リファレンスもありました。

 

クロックの設定のやり方が見つからない。pdfのマニュアルに記載されていたが、476RGは小電力等で別のようなことが書いてある。

476RGボードにX3水晶発振子とC33,C34コンデンサを取り付けるパターンが用意されていた。(内臓のクロックは精度が悪いので精度が必要な場合、水晶発振子+コンデンサを追加できる?)(面実装のチップを外したり、ハンダ付けしたり大変そう!)

476RGボードはマイコン本体部と電源、USBシリアル変換部の間にミシン目が入っていて分割できるが、分割しなければUSBシリアル変換部用の8MHz水晶発振子を利用して80MHzのクロックを使用できるみたい?下記のHP参考

 

参考?http://yuki-sato.com/wordpress/2016/01/24/%E5%8B%95%E4%BD%9C%E5%91%A8%E6%B3%A2%E6%95%B0%E3%82%92168mhz%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/

参考? http://memo.tank.jp/archives/11460

 

NucleoはArduino用のシールドがそのまま使用できるそうです。(コードは違います。タイミングなどが微妙な物も使用できないと思います。)

自作のマイクロSDカードシールドが使用できるか挑戦します。ライブラリ等ソフトの面でハードルが高いです。

例のごとく説明書は数行で動作確認をするためだけのものです。(しかも英語。Google翻訳にしこしこ入力してふんふんわかった)

http://akizukidenshi.com/catalog/g/gM-10177/

言語はC++ベースらしいので少しややこしい??Arduinoも始めたばかりなのにわかるか不安。(数ヶ月前にC言語を少しやったが完全に記憶から喪失)

C++入門 http://www.asahi-net.or.jp/~yf8k-kbys/newcpp0.html

でもお買い得のような予感が。

 

 

 (上記の青地に白文字、緑地に白文字の記号が、端子記号としてプログラムのコードで使用できます。)

◆ボードの仕様
・電源:USBバスパワーまたは、外部供給(3.3V、5V、7~12V)
・USBコネクタ:USBミニBタイプ(PCのペリフェラルとして接続)
・デバックポート:SWD(6ピンヘッダ)
・LED:USB状態表示(赤/緑)LD2、電源表示(赤)LD1、ユーザー用(緑)LD3
・スイッチ:ユーザー用タクトスイッチ(青)×1、リセット用タクトスイッチ(黒)×1
・サポート開発環境:IAR、Keil、GCCベースのIDE
・デモソフト:ブログラム済み(ユーザー用(緑)LEDが点滅)

■CPUの仕様
・CPU:STM32L476RGT6
・CPUコア:ARM32bit Cortex-M4
・周波数:最大80MHz
・CPU電源:1.71V-3・6V
・フラッシュ:1MB
・SRAM:128KB
・QuadSPI:x1
・タイマー(AdvancedControl):x2
・タイマー(General Purpose):x7
・タイマー(Basic):x2
・タイマー(LOW-Power):x1
・SPI:x3
・I2S:x3
・USART:x3
・UART:x2
・LPUART:c1
・USB OTG:x1
・CAN:x1
・SAI:x2
・SDMMC:x1
・SWPMI:x1
・LCD:x1(8x28 or 4x32)
・GPIO:x51
・静電容量センシング:x12
・ADC:12bitx3 16ch
・DAC:12bit 2ch
・アナログコンパレータ:x2
・オペアンプ:x2

 

開発環境

Arduino のようなIDEのインストールは不要です。

 

mbed対応

ブラウザ上で開発するようです。

 

まず、ボードをパソコンのUSB端子に接続します。

USBメモリ(STM32L476RGはフラッシュ:1MB)として認識 されます。

エクスプローラが起動しmbet.htmが入っています。(そのほかに隠しファイルとフォルダもありました)

このドライブを「MBED」ドライブと言います。

 

mbet.htmをブラウザで開きます。

 

mbedのログイン・ページが表示されます。

新しくmbedを始めるには,ユーザ登録が必要です。

ログインするとARMmbed NUCLEO-L476RGのページが開きます。

 

このページの右上隅にCompilerというリンクがあります。これを押すとNUCLEO-L476RG用のMBEDが別のタブで起動します。

 

別に何も難しいことはありませんでした、新規作成でテンプレートを指定するといろいろなNUCLEO-L476RG用のサンプルプログラムが開きます。

 

これをコンパイルするとプログラム名_NUCLEO_L476RG.binを開くダイヤログが表示される。

 

ファイルを保存するにチェックが入っていることを確認して、OKを押すと、マイドキュメント¥ダウンロードフォルダ(私の環境)にファイルが保存される。

 

このプログラム名_NUCLEO_L476RG.binを「MBED」ドライブにコピーするとLD1のLEDが点滅したあとプログラムが実行されます。

 

ツールバーの表示→最新の情報に更新するをクリックすると・・・・・.binは消えます。(プログラムは実行したままです)

前のファイルを消さなくても、新しい・・・・.binをコピーすると、前の・・・・・.binは残っていますが新しいプログラムが実行されます。

 

NUCLEO-L476RG(サンプルプログラム)とArduinoのコードの比較(異なる部分)

Arduino(C言語をベースにいくつかのC++の機能をサポート)                             mbed  NUCLEO-L476RG(C++ベース)

Blink

void setup() {
 
  pinMode(13, OUTPUT);
}


void loop() {
  digitalWrite(13, HIGH);   // turn the LED on

 


  delay(1000);              // 1秒wait


  digitalWrite(13, LOW);    // turn the LED off


  delay(1000);              // 1秒wait
}

#include "mbed.h"
DigitalOut myled(LED1);    //Pin名はLED1 , D13 , PA_5 のいづれも同じ

 

int main() {
    while(1) {                           //ループさせる必要がある
        myled = 1; // LED is ON ("1" or "0" or "true" or "false")

                                                 // HIGHはエラーになる

        wait(1.0); // 1 sec

        myled = 0; // LED is OFF(myled = !myled)でもよい
        wait(1.0); // 1 sec
    }
}


-----------------------------------------------------------------------------------------------------

//ArduinoIDEのシリアルモニタ起動する

//シリアルモニタを9600 baudsに設定

//A0入力端子が2V以上になればLED1を点灯する

//可変抵抗器の両端を+3.3VとGNDに接続、中央をA0に接続する。

//このコードをコピペでエラーがでたら全角スペースが入っているかも

void setup() {
  pinMode(13, OUTPUT);    
// initialize digital pin 13 as an output.

  Serial.print("\nAnalogIn example\n");

}
void loop() {

 

 //修正途中

    int meas = analogRead(A0);

 

  meas = map(meas,0,1023,0,5);

 

    Serial.print("measure = ");

   Serial.print(meas);

   Serial.print(" mV\n");

  if(meas > 2) {

    digitalWrite(13, HIGH);   // turn the LED on
  }

  else {
    digitalWrite(13, LOW);    // turn the LED off
  }

  delay(200);              // 200 ms
}

 

----------------------------------------------------------------------------------------------------

//D12pinをプルアップ入力モードにしてタクトSWを接続し、片側をGNDに接続する。

//タクトSWを押すと、ボードに搭載のLED(L)が点灯→消灯を繰り返す

byte myled = true;

void setup() {
  pinMode(12,INPUT
_PULLUP);  //initialize digital pin 12 as an input_pullup mode.}

  pinMode(13, OUTPUT);     // initialize digital pin 13 as an output.

}

void loop() {

   if(digitalRead(12) == LOW){

    myled = !myled;   //SWが押されるとON,OFFを反転する

        digitalWrite(13, myled);   // LED on,off

    delay(200);  //200 ms

  }

}

-----------------------------------------------------------------------------------------------------

//シリアル通信

//ArduinoIDEのシリアルモニタ起動する

//シリアルモニタを9600 baudsに設定

byte myled = true;

  int i = 1;

 

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);

  pinMode(13, OUTPUT);     // initialize digital pin 13 as an output.

  Serial.println("Hello World !");

}

void loop() {

  delay(1000);  //1 sec

  Serial.print("This program runs since ");

  Serial.print(i);

  Serial.print(" seconds.\n");

     i++;

    myled = !myled;   //SWが押されるとON,OFFを反転する

    digitalWrite(13, myled);   // LED on,off

}

-----------------------------------------------------------------------------------------------------

 

-----------------------------------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-----------------------------------------------------------------------------------------------------

//Loopしなくても点滅する
#include <MsTimer2.h> // タイマー割り込みヘッダファイル // 割り込み時に処理される関数 void flash() { static boolean output = HIGH; // プログラム起動前に1回だけHIGH(1)で初期化される digitalWrite(13, output); // 13番ピン(LED)に出力する(HIGH>ON LOW>OFF) output = !output; // 内容を反転(HIGH→LOW/LOW→HIGH)させoutputにセットする } // 電源起動時とリセットの時だけのみ処理される関数(初期化と設定処理) void setup() { pinMode(13, OUTPUT); // 13番ピンを出力に設定(13番ピンにLEDが接続されている為) MsTimer2::set(100, flash); // 100ms毎にflash( )割込み関数を呼び出す様に設定 MsTimer2::start(); // タイマー割り込み開始 } void loop() { // }

-----------------------------------------------------------------------------------------------------

 //Stepping Motor 28BYJ48 Driver  ULN2003

int motorPin1 = 4;     // Blue   - pin 1

int motorPin2 = 5;    // Pink   - pin 2

int motorPin3 = 6;    // Yellow - pin 3

int motorPin4 = 7;    // Orange - pin 4

                       // Red    - pin 5 (VCC)

 

int motorSpeed = 2300;  //速度。数値が小さいほど速くなる。2000以下は脱調が起きる

int count = 0;          // カウント変数

int countsperrev = 512; // 1回転

int lookup[4] = {B01100, B00110, B00011, B01001};  //2相励磁

float dim = 0;  //回転角度

const float oneStep = 5.625/32;  //1ステップの角度

 

void setup() {    //IO Pin番号設定

  pinMode(motorPin1, OUTPUT);

  pinMode(motorPin2, OUTPUT);

  pinMode(motorPin3, OUTPUT);

  pinMode(motorPin4, OUTPUT);

  Serial.begin(9600);

}

 

void loop(){

  if(count < countsperrev )

    clockwise();

  else if (count == countsperrev * 2)

    count = 0;

  else

    anticlockwise();

  count++;

}

 

void anticlockwise()    //反時計回り

{

  for(int i = 0; i < 4; i++)

  {

    setOutput(i);

    delay(motorSpeed/3);

    dim = dim - oneStep;  //回転角度カウント

    Serial.println(dim);  //回転角度表示

  }

}

 

void clockwise()    //時計回り

{

  for(int i = 3; i >= 0; i--)

  {

    setOutput(i);

    delay(motorSpeed/3);

    dim = dim + oneStep;  //回転角度カウント

    Serial.println(dim);  //回転角度表示

  }

}

 

void setOutput(int out)

{

  digitalWrite(motorPin1, bitRead(lookup[out], 0));

  digitalWrite(motorPin2, bitRead(lookup[out], 1));

  digitalWrite(motorPin3, bitRead(lookup[out], 2));

  digitalWrite(motorPin4, bitRead(lookup[out], 3));

}

 

-----------------------------------------------------------------------------------------------------

//tera Termを起動する//tera Termの設定(ポートNo)

//A0入力端子が2V以上になればLED1を点灯する

//可変抵抗器の両端を+3.3VとGNDに接続、中央をA0に接続する。

 

#include "mbed.h"
 
AnalogIn analog_value(A0);
 
DigitalOut led(LED1);

int main() {
    float meas;
   
    printf("\nAnalogIn example\n"); 
   
    while(1) {
        meas = analog_value.read();

// Converts and read the analog input value (value from 0.0 to 1.0)

 

        meas = meas * 3300;

// Change the value to be in the 0 to 3300 range

 

        printf("measure = %.0f mV\n", meas); 
        if (meas > 2000) {

// If the value is greater than 2V then switch the LED on
            led = 1;
        }
 

       else {
            led = 0;
        }
 

       wait(0.2); // 200 ms
    }
}

 

----------------------------------------------------------------------------------------------------

//マイコンボードに搭載のスイッチを押すと、ボードに搭載のLEDが点灯→消灯を繰り返す

#include "mbed.h"
 

 

 


DigitalIn mybutton(USER_BUTTON);  //USER_BUTTON=ボード搭載のSW(青)MCUの2番pin/PC13に接続(Arduinoにはなし)

 

DigitalOut myled(LED1);  //LED1=ボード搭載のLED(LD2)D13/SCKに接続
 
int main() {
  while(1) {                      //ループさせる
    if (mybutton == 0) { // Button is pressed
      myled = !myled; // Toggle the LED state(myledのON,OFFを反転する)

 

 

 

      wait(0.2); // 200 ms
    }
  }
}
 ----------------------------------------------------------------------------------------------------

//シリアル通信

//tera Termを起動する

//tera Termの設定(ポートNoと下記による)

#include "mbed.h"

//------------------------------------
// Hyperterminal configuration
// 9600 bauds, 8-bit data, no parity
//------------------------------------

Serial pc(SERIAL_TX, SERIAL_RX);
 
DigitalOut myled(LED1);
 
int main() {
  int i = 1;
  pc.printf("Hello World !\n");
  while(1) {
      wait(1);  1 sec
      pc.printf("This program runs since %d seconds.\n", i++);
      myled = !myled;  //PCと通信するたびにLED1(LD2)を点滅させる
  }
}

-----------------------------------------------------------------------------------------------------

//tera Termを起動する

//tera Termの設定(ポートNo)

//tera Termにpwm set to 10.00%と表示される

 

#include "mbed.h"

PwmOut mypwm(PWM_OUT);

DigitalOut myled(LED1);

int main() {
   
    mypwm.period_ms(10);     //pwm繰り返し周期=10ms => 周期=10kHz
    mypwm.pulsewidth_ms(1);  //パルス幅1ms
 
    printf("pwm set to %.2f %%\n", mypwm.read() * 100);
   
    while(1) {
        myled = !myled;
        wait(1);
    }
}

-----------------------------------------------------------------------------------------------------

//while文でLoopしなくても点滅する

#include "mbed.h"

Ticker toggle_led_ticker;  //繰り返しタイマー割込み 初期化 Ticker name;

DigitalOut led1(LED1);     //ピン出力 初期化 DigitalOut name(pin);
 
void toggle_led() {  //LED点滅関数
    led1 = !led1;
}

int main() {
    // Init the ticker with the address of the function (toggle_led) to be attached and the interval (100 ms)
    toggle_led_ticker.attach(&toggle_led, 0.1);
    while (true) {
        // Do other things...
    }
}

-----------------------------------------------------------------------------------------------------

#include "mbed.h"

DigitalOut motorPin1(D4);    // Blue   - pin 1

DigitalOut motorPin2(D5);    // Pink   - pin 2

DigitalOut motorPin3(D6);    // Yellow - pin 3

DigitalOut motorPin4(D7);    // Orange - pin 4

                                                      // Red    - pin 5 (VCC)

 

float motorSpeed = 2.3;  //速度。数値が小さいほど速くなる。2.0以下は脱調が起きる

int count = 0;          // カウント変数

int countsperrev = 512; // 1回転

int lookup[4] = {0b1100, 0b0110, 0b0011, 0b1001};  //2相励磁

float dim = 0;  //回転角度

const float oneStep = 5.625/32;  //1ステップの角度

 

void setOutput(int out)

{

  motorPin1 = ( lookup[out] & ( 1 << 0 ) ) ? 1 : 0;  //lookup[out] の0bit

  motorPin2 = ( lookup[out] & ( 1 << 1 ) ) ? 1 : 0; //lookup[out] の1bit

  motorPin3 = ( lookup[out] & ( 1 << 2 ) ) ? 1 : 0; //lookup[out] の2bit

  motorPin4 = ( lookup[out] & ( 1 << 3 ) ) ? 1 : 0;  //lookup[out] の3bit

}

 

 

void anticlockwise()    //反時計回り

{

  for(int i = 0; i < 4; i++)

  {

    setOutput(i);

   wait(motorSpeed/3);

    dim = dim - oneStep;  //回転角度カウント

//    printf(dim);  //回転角度表示//printfでエラー??

//    printf("\n")); //なぜ他のprintfがよくてこのprintfがエラーでるの??

  }

}

 

void clockwise()    //時計回り

{

  for(int i = 3; i >= 0; i--)

  {

    setOutput(i);

    wait(motorSpeed/3);

    dim = dim + oneStep;  //回転角度カウント

//    printf(dim);  //回転角度表示

//    printf("\n"));

  }

}

 

 

 int main() {

 while(1) {

  if(count < countsperrev )

    clockwise();

  else if (count == countsperrev * 2)

    count = 0;

  else

    anticlockwise();

 

  count++;

 }

}

 


液晶ライブラリで日立HD44780ドライバと互換性のあるLCDディスプレイを制御

参考:Arduino Learning > TUTORIALS > Examples from Libraries > LiquidCrystal > HelloWorld

https://www.arduino.cc/en/Tutorial/HelloWorld



//Arduino
#include <LiquidCrystal.h> // initialize the library with the numbers of the interface pins LiquidCrystal lcd(12, 11, 5, 4, 3, 2); void setup() { // set up the LCD's number of columns and rows: lcd.begin(16, 2); // Print a message to the LCD. lcd.print("hello, world!"); } void loop() { // set the cursor to column 0, line 1 // (note: line 1 is the second row, since counting begins with 0): lcd.setCursor(0, 1); // print the number of seconds since reset: lcd.print(millis() / 1000); }

 

//mbed  NUCLEO-L476RG

//TextLCD.hはmbedからインポートが必要

#include "mbed.h"
#include "TextLCD.h" //HD44780 TextLCD.h

TextLCD g_lcd(D12, D11, D5, D4, D3, D2);  // RS, E, DB4, DB5, DB6, DB7

int main() {

    Timer t;   //Timer初期化
    g_lcd.cls();
    g_lcd.locate(0, 0);
    g_lcd.printf( "hello, world!" );

    t.start();


    while(1) {
        g_lcd.locate(0, 1);
        g_lcd.printf( "%f",t.read() );  //Timer時間読み取りLCDに表示

                                                            //小数点以下の秒も表示される
    }
}


CHARACTER FONT TABLE

0x0〜0x7 の赤枠内はスケッチ内で定義しているユーザー定義CHARACTER

 

0x8を指定すると、なぜか0x0が表示される。(0x8を定義していない場合)

256を指定しても0x0が表示される。

 

ユーザー定義CHARACTERは0xF(15)まで定義できるみたいですが、8個以上定義すると表示がおかしくなります。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

//Arduino

//CHARACTER FONT TABLE

#include <Wire.h>
#include <LiquidCrystal.h>

//ユーザー定義CHARACTER MAPPING
uint8_t bell[8]  = {0x4,0xe,0xe,0xe,0x1f,0x0,0x4};
uint8_t note[8]  = {0x2,0x3,0x2,0xe,0x1e,0xc,0x0};
uint8_t clock[8] = {0x0,0xe,0x15,0x17,0x11,0xe,0x0};
uint8_t heart[8] = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0};
uint8_t duck[8]  = {0x0,0xc,0x1d,0xf,0xf,0x6,0x0};
uint8_t check[8] = {0x0,0x1,0x3,0x16,0x1c,0x8,0x0};
uint8_t cross[8] = {0x0,0x1b,0xe,0x4,0xe,0x1b,0x0};
uint8_t retarrow[8] = {  0x1,0x1,0x5,0x9,0x1f,0x8,0x4};
 
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);  // (RS,E,D4,D5,D6,D7)

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

void setup()
{
  lcd.begin(16, 2);
  // CHARACTER定義
  lcd.createChar(0, bell);
  lcd.createChar(1, note);
  lcd.createChar(2, clock);
  lcd.createChar(3, heart);
  lcd.createChar(4, duck);
  lcd.createChar(5, check);
  lcd.createChar(6, cross);
  lcd.createChar(7, retarrow);

  displayKeyCodes();
}

void displayKeyCodes(void) {
//  uint8_t cha = 0xA2;  //16進
  uint8_t cha = 3;           //10進 表示するキャラクタの番号を指定する

    lcd.clear();
    lcd.setCursor(0, 0);
      lcd.printByte(cha);  //CHARACTERを表示
}

void loop() {}

ユーザー定義CHARACTERをつくる

ユーザー定義CHARACTERは0x0〜0x7の8個作成することが出来ます。

 

LCDの1文字のドットを数えると、横5ドット、縦7ドットです。

 

着色したドットを1とし、着色しないドットを0とする。

1行毎に数字を並べる。(2進)

これを16進に変換する。

 

//ユーザー定義CHARACTER MAPPING
uint8_t usr[8] = {  0x12,0x12,0xA,0xB,0xF,0xF,0xE};

 一番下の列はカーソルを表示する。

 

 

 

//Arduino

//CHARACTER FONT MAPPING

#include <Wire.h>
#include <LiquidCrystal.h>

//ユーザー定義CHARACTER MAPPING
uint8_t usr[8] = {  0x12,0x12,0xA,0xB,0xF,0xF,0xE};  //ここに上表の数値を入れる
 
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);  // (RS,E,D4,D5,D6,D7)

#if defined(ARDUINO) && ARDUINO >= 100
#define printByte(args)  write(args);
#else
#define printByte(args)  print(args,BYTE);
#endif

void setup()
{
  lcd.begin(16, 2);
 
  lcd.createChar(15, usr);  // CHARACTER定義
  displayKeyCodes();
}

void displayKeyCodes(void) {
//  uint8_t cha = 0xA1;  //
  uint8_t cha = 15;  //

    lcd.clear();
    lcd.setCursor(0, 0);
      lcd.printByte(cha);  //ユーザー定義CHARACTERを表示
}

void loop() {
}

//mbed L476RG

//CHARACTER FONT MAPPING

 

#include "mbed.h"
#include "TextLCD.h"  //Text LCD Enhanced Libraryをインポート

                                         //同じ"TextLCD.h"でも色々あるので注意


TextLCD lcd(D2, D3, D4, D5, D6, D7);

int main(void) {
    lcd.cls();
    lcd.locate(0, 1);

    const char usr[] = {0x12, 0x12, 0x0A, 0x0B, 0x0F, 0x0F, 0x0E, 0x00};  // ここに上表の数値を入れる
    lcd.setUDC(15, (char *) usr);  // CHARACTER定義
    lcd.putc(15);  //LCDに表示

//    lcd.putc(0x21);
    return 0;
}


Excel、Libre Office Calc でユーザー定義CHARACTERのcodeを自動的に作成する。

LibreOffice Calcで作成、

Excelも多分同じはず。

 

各セルの式

H2

=B2&C2&D2&E2&F2

I2

=BIN2DEC(H2)

J2

=BIN2HEX(H2)

K2

="0x"&J2

 

 

 

3〜8の行は2行をコピーする。

11、13の行はKの列をただ入れただけ。

配列名"usr"は規則に準じ自由につけることができる。

11、13の行をコピーしてエディタにペーストするとcodeをコピペできる。ただし、空白がたくさん入る。

 

Arduino用16桁x2行Text LCD シールド製作

市販のText LCD シールドはLCD側とArduino側のPin接続が固定なので他のシールドと同時に使えない場合があるようなので、Pin接続を後で変更できるようにジャンパーワイヤで接続するようにしました。

 

基本の回路はArduinoのホームページのLearning->Hello World!

の回路図のLCDとArduinoの間にピンソケットを入れてPinの割当を自由に変えることができるようにしました。

 

https://www.arduino.cc/en/Tutorial/HelloWorld

 

基本の回路にタクトスイッチとプルダウン回路を3組入れました。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

左図のジャンパワイヤーは下記のスケッチ用です。

左の写真は最初の計画に不具合があったので修正しています。

(ハンダ付けが見苦しいのはご了承ください。)

最初は右上のピンヘッダでプルダウン抵抗とプルアップ抵抗を差し替えできるかなと思っていましたができなかったので、ジャンパーワイヤの所にプルダウン抵抗を入れました。

回路は上の図と同じにしました。

 

中央、右のスイッチを押すと左右にスクロールします。

 

 基板とLCDの間に配線用のスキマをあけるためにネジで少し浮かせています。

部品表

 

16桁x2行 Text LCD ( 型番:1602A)   1個

 

Amazonで送料込みで250円程度で購入

 中国から発送されるので到着まで2〜3週間かかります。

 

 

Arduino用ユニバーサル基板 ガラスコンポジット(赤) ( 型番:AE-ARDUINO_UNI-R) 1個

 

秋月電子通商で購入   1枚 180円(税込み)

別途送料が必要(購入金額にかかわらず1回500円)

まとめ買いがお得

 

 

 ピンソケット 1x6 (6P) リード長15mm ( 型番:FH150-1x6SG ) 2個
秋月電子通商で購入  1個 40円

ピンソケット 1x8 (8P) リード長15mm ( 型番:FH150-1x8SG ) 2個
秋月電子通商で購入  1個 50円

 

半固定ボリューム 3362P 10kΩ [103] ( 型番:3362P-1-103LF ) 1個

秋月電子通商で購入  1個 40円

 

 

タクトスイッチ(黒色) ( 通販コード P-03647 ) 3個

秋月電子通商で購入  1個 10円(他にも7色程度あり)

 

抵抗

220Ω  1個

10kΩ  3個

 

分割ロングピンソケット 2x42 (84P) ( 型番:FHU-2x42SG ) 1個

秋月電子通商で購入  1個 100円(2x6Pに切断して使用)

 

分割ロングピンソケット 1x42 (42P) ( 型番:FHU-1x42SG ) 1個

秋月電子通商で購入  1個 80円(1x3P、1x6Pに切断して使用)

 

その他、電線、ハンダ等

Arduino用スケッチ

下記のHPのcodeをpin番号のみ修正すれば動作します。

LED等付いていないが関係なく動作します。

この場合、電源投入後 中央、右ボタンを同時に押すとLCDに表示される。

中央、右ボタンのどちらかを押すと左右にスクロールします。

 

//下記のコードは電源投入後、中央、右ボタンのどちらかを押すと左右にスクロールします。

//http://www.nudatech.com/blog/scrolling-text-on-16x2-lcd-controlled-by-pushbuttons/
//のエラー処理、LED処理等を省いたもの
#include <LiquidCrystal.h>

const int PIN_BUTTON1 = 8;  // digital  中ボタンのpin
const int PIN_BUTTON2 = 9;  // digital  右ボタンのpin
 
//  LCDのpinをArduinoのpinに割り当てる
//               (RS,E,D4,D5,D6,D7)
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);

const int LCD_COLS = 16;  // LCDの桁数

// start position for text
int lcd_start = 0;

const char TEXT[] = "This is a long text brought to you by www.nudatech.com";  //表示される文字
const int TEXT_LEN = (sizeof(TEXT) / sizeof(char)) - 1;
const int LCD_LIMIT = TEXT_LEN - LCD_COLS;

void setup()
{
  // -- SET DIGITAL PINS --
  pinMode(PIN_BUTTON1, INPUT);
  pinMode(PIN_BUTTON2, INPUT);
 
  // -- SET UP LCD --
  lcd.begin(LCD_COLS,2);
}

void loop()
{
  // -- read buttons --
  int state_button1 = digitalRead(PIN_BUTTON1);
  int state_button2 = digitalRead(PIN_BUTTON2);

    //中ボタン押し
    if(HIGH == state_button1)
    {
      if(lcd_start > 0)
      {
        lcd_start--;
 
        delay(200);
      }
    }
 
    //右ボタン押し
    if(HIGH == state_button2)
    {
      if(lcd_start < LCD_LIMIT)
      {
        lcd_start++;

        delay(200);
      }
    }
 
    // -- print text on the LCD --  //
    for(int i = 0; i < LCD_COLS; i++) //0からLCD桁数まで繰り返す
    {
      lcd.setCursor(i, 0);            //i桁に
      lcd.print(TEXT[lcd_start + i]);  //表示する文字のlcd_start + i番目の文字を表示
    }
 
  delay(50);
}

mbed  NUCLEO-L476RG


STM32 Nucleo Boardの開発環境にArduino IDEを利用する。

ArduinoのシールドをNucleo Boardで利用する場合、Nucleo-F4xxを使用してArduino IDEで開発すればArduinoのスケッチをPin名の変更程度でそのまま使用できるかもしれない。

参考サイト

http://prettoguitar.blogspot.jp/2015/07/arduino-for-stm32.html

空気のない音

 

 

STM32 Nucleo Board STM32F303K8

ブレッドボードで使用できる!

http://akizukidenshi.com/catalog/g/gM-10172/

大きさ50X18mm

■STM32 Nucleo-32シリーズ共通
・32ピンのSTM32シリーズマイクロコントローラを搭載
・ArduinoNano互換のピン配置
・ARM-mbedに対応
・オンボードST-LINK/V2-1デバッカ、仮想COMポート対応
・USB電源、外部電源に対応(3.3V、5V、7-12V)
・USB通信用LED(LD1)、電源LED(LD2)、ユーザLED(LD3)が実装されています。
・リセットプッシュボタン有り
・USBコネクタは、マイクロUSBです。

 

■CPUの仕様
・CPU:STM32F303K8T6                               ・CPUコア:ARM32bit Cortex-M4
・周波数:最大72MHz                                          ・CPU電源:2.0V-3・6V
・フラッシュ:64KB                                                 ・SRAM:16KB
・タイマー(AdvancedControl):x1                     ・タイマー(General Purpose):x5
・タイマー(Basic):x2                                            ・SPI/I2S:x1
・I2C:x1                                                                  ・USART:x2
・CAN:x1                                                                ・ADC:12bitx2 9ch
・DAC:12bitx2 3ch                                            ・GPIO:x25
・RTC:x1   

ArduinoProMiniサイズのもありますね。

もう少しプログラムが組めるようになったら考えよっと。

これだと高速なので競技用のロボットに最適??

ステッピングモーターを使って性能が悪くてもいいからマイクロマウスを作りたいけれども先が長そう。

プログラムが難しそうな気がするが、簡単なものならできるかな??

リンク

 

3D CAD

http://www.123dapp.com/design