北東北 LabVIEWユーザー会

キャンセル
次の結果を表示 
次の代わりに検索 
もしかして: 

4桁7セグメントLEDをLINX(Arduino UNO)で使ってみる

実際に自作の装置の表示に7セグメントLEDを使おうと思う人は、最近ではあまりいないように思いますが、TM1637という制御ICが使われているものが200円前後で入手できるためLINXを試してみるのには手ごろなデバイスだと思います。

例えば下記URL(Amazonのサイト)のようなものです。

デバイスの例

 

 

このデバイスは電源(3.3V/5V)とGNDとデジタルIOが2本で制御することができます。

M1021350.JPG

ここでは、CLKに2ピン、DIOに3ピンを使いましたが、デジタルIOピンならばどれでもOKなはずです。

 

Arduinoで使う場合には多くの人がライブラリを提供してくれていますので、簡単に使うことができます。ここでは「TM1637」というライブラリを使わせてもらいました。この記事はArduino UNOでLINXを使いますが、その続編として、ここで作ったVIをRaspberry PiのLINXで動かしたいと思っています。Raspberry PiではArduino用ライブラリはそのままでは動きませんので、LabVIEW LINXに移植をする必要があります。

 

何らかのデバイスをRaspberry PiでLINXで動かしたいときには、以下の手順が手軽だと思います。

(1)Arduinoでそのデバイスを動かしてみる。

(2)ライブラリを使っている場合は、ライブラリを調べてライブラリが無くとも動くArduinoプログラムを書く。

(3)LINXに移植してArduinoで動作を確認する。

(4)Raspberry Piに移植する。

 

この記事では(3)までを説明します。

 

(1)Arduinoプログラム

0から9999までカウントアップを繰り返すプログラムです。

#include <Arduino.h>
#include <TM1637Display.h>

// Module connection pins (Digital Pins)
#define CLK 2
#define DIO 3
TM1637Display display(CLK, DIO);

uint8_t data[] = { 0xff, 0xff, 0xff, 0xff };
int digit[4];
void setup() {
  // put your setup code here, to run once:
  display.clear();
  display.setBrightness(0x0f);
}

void loop() {
  
  for(int i=0;i<10000;i++){
    digit4(i);
    delay(10);
  }
  
}

void digit4(int N){
  for(int i=0;i<4;i++){
    digit[i]=N%10;
    data[3-i]=display.encodeDigit(digit[i]);
    N=N/10;
  }
  display.setSegments(data);
}

 

(2)

ライブラリを取り込んだので長くなりますが、ライブラリ無しで動作します。もちろんTM1637のデータシートも参考にしました。

#include <Arduino.h>

#define CLK 2
#define DIO 3
#define BIT_DELAY  100
#define Brightness 0x0F//Select:0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,
#define COMM1 0x40 //0b01000000
#define COMM2 0xC0 //0b11000000
#define COMM3 0x80 //0b10000000


//
//      A
//     ---
//  F |   | B
//     -G-
//  E |   | C
//     ---
//      D
const uint8_t my_digitToSegment[] = {
 // XGFEDCBA
  0b00111111,    // 0
  0b00000110,    // 1
  0b01011011,    // 2
  0b01001111,    // 3
  0b01100110,    // 4
  0b01101101,    // 5
  0b01111101,    // 6
  0b00000111,    // 7
  0b01111111,    // 8
  0b01101111,    // 9
  0b01110111,    // A
  0b01111100,    // b
  0b00111001,    // C
  0b01011110,    // d
  0b01111001,    // E
  0b01110001     // F
  };
  
uint8_t segmentData[4];
uint8_t digit[4];

void setup() {
  pinMode(CLK, OUTPUT);
  pinMode(DIO,OUTPUT);
  digitalWrite(CLK, HIGH);
  digitalWrite(DIO, HIGH);
  clearDigit4();
}

void loop() {
  for(int i=0;i<10000;i++){
    digit4(i);
    delay(10);
  }
}

void digit4(int N){
  for(int i=0;i<4;i++){
    digit[i]=N%10;
    segmentData[3-i]=my_digitToSegment[digit[i]&0x0F];
    N=N/10;
  }
  TM1637setSegments(segmentData);
}

void clearDigit4(){
  for(int i=0;i<4;i++){
    segmentData[i] = 0;
  }
  TM1637setSegments(segmentData);
}

void TM1637setSegments(const uint8_t segments[])
{
  uint8_t length=4;
  uint8_t pos=0;
  TM1637start();
  TM1637writeByte(COMM1);//COMM1: 0b01000000
  TM1637stop(); 
  TM1637start();
  //TM1637writeByte(COMM2 + (pos & 0x03)); //COMM2: 0b11000000 pos: 0
  TM1637writeByte(COMM2); //auto increment from 0
  for (uint8_t k=0; k < length; k++)
    TM1637writeByte(segments[k]);
  TM1637stop();
  TM1637start();
  TM1637writeByte(COMM3 + (Brightness & 0x0f)); //COMM3: ob10000000
  TM1637stop();
}

void TM1637bitDelay()
{
  delayMicroseconds(BIT_DELAY);
}

void TM1637start()
{
  digitalWrite(DIO, LOW);
  TM1637bitDelay();
  //digitalWrite(CLK, LOW);
}


bool TM1637writeByte(uint8_t b)
{
  uint8_t data = b;
  for(uint8_t i = 0; i < 8; i++) {
    digitalWrite(CLK, LOW);
    TM1637bitDelay();
    if (data & 0x01){
      digitalWrite(DIO, HIGH);
    }
    else {
      digitalWrite(DIO, LOW);
    }
    TM1637bitDelay();
    digitalWrite(CLK, HIGH);
    TM1637bitDelay();
    data = data >> 1;
  }
  
  digitalWrite(CLK, LOW);
  digitalWrite(DIO, HIGH);
  TM1637bitDelay();
  digitalWrite(CLK, HIGH);
  
  TM1637bitDelay();
  pinMode(DIO, INPUT);
  uint8_t ack = digitalRead(DIO);
  pinMode(DIO, OUTPUT);
  if (ack == 0){
    digitalWrite(DIO, LOW);
  }
  TM1637bitDelay();
  digitalWrite(CLK, LOW);
  TM1637bitDelay();
  return ack;
}

void TM1637stop()
{
  digitalWrite(DIO, LOW);
  TM1637bitDelay();
  digitalWrite(CLK, HIGH);
  TM1637bitDelay();
  digitalWrite(DIO, HIGH);
  TM1637bitDelay();
}

 

(3)LabVIEW LINXに移植します。

mainパネル.pngmainダイアグラム.pngプロジェクト.png

ほぼライブラリの関数がサブVIになりました。一部のサブVIを紹介します。

データの書き込み.pngデジタルIO.png

 

ArduinoにLINXファームウェアを書き込んで動作を確認しました。Arduino用LINXはシリアルでコマンドを送っているので数字のカウントアップに1秒ぐらいかかります。

 

Raspberry Piに移植すればとても早くなると思います。

 

upload220102.zipには以下のファイルが入っていますので興味のある方はご覧ください。

 

ライブラリを使ったArduinoプログラム:4DigitCountUp

ライブラリを使わないArduinoプログラム:4DigitCountUpWoLibrary03

LabVIEW LINXに移植したプログラム:4DigitDisplay

 

0 件の賞賛
メッセージ1/1
1,947件の閲覧回数