オシロスコープに「令和」を表示して、今上天皇の御退位と新天皇の御即位をささやかながら祝福しようと思います。
さて、どうやってオシロスコープに文字を表示しましょうか。まずは、アナログオシロスコープの仕組みを下記のリンクで説明します。
******まもなく公開します、少々お待ちください*********
さて、身近で文字が表示されているものといえば、電工掲示板です。電工掲示板は、よく見るとLEDのドットの集まりでできています。では、電光掲示板LED一つ一つが、ICのピンとつながっているでしょうか、、、、、、
そんなことは、ありません。通常のマトリックスLEDは、下のようになっています。
例えば、4×4のマトリックスの場合、百マス計算のように、LEDのアノード側(電流を入れる方)は横列に分配され、カソード側(電流を出す方)は、縦列で共通の分配されてます。
カソード側のスイッチは、順番に高速で切り替えていき、そのときONになっている列で、表示するLEDを、アノード側のスイッチで指定し、その列で光らせます。これを、人間の目では追えない速さで行うことで、残像が重なり、あたかも全部の列が点いているように見えます。切り替える速度は、10m秒以下であれば人間の目はごまかせるようです。
これと同じことをオシロスコープで行います。
オシロスコープは、通常の波形表示として使う場合、時間軸を停止させることはできません。かならず、ある一定の速度で右方向に進みつづけます。そこで、横軸を32bitに分割、縦軸を16bitに分割し、上図のように下から順番に特定の高さで、表示させます。
表示する点は、その位置で表示し、表示しない点は、一番下のビットに指定します。これにより、表示したい文字が浮き出るのです。すべてのドットを表示させた写真が下です。
イタリックな文字は、斜めに書かれることが多いですが、ひょっとして技術的な問題で、斜め文字になってたりして、とか考えてました。
では、この制御は、どのようにして組むのでしょうか。
下が、今回製作した回路図です。すべて、ブレッドボードで作成しました。
さて、回路図に現れた無数の抵抗は、何でしょうか。 これが、R2Rラダー抵抗と呼ばれるものです。これは、2進数の0/1ビット出力を、アナログな電圧に変換する回路です。これは、ある抵抗値Rと、その二倍の抵抗値2Rを図のように接続することで可能になります。デジタル信号の0/1は、アナログ的に見れば、5Vか0Vです。これを、arduinoのデジタルピンからそれぞれ出力し、R2Rラダー抵抗で、0~5Vを6bit(64分割)にします。下図の場合、(, , 01 1011)dで入力したとすれば、出力電圧は、27/64×5=2.1[V]ということになります。
以上が、回路になります。とてもシンプルであります。
あとは、arduinoでプログラミングをするだけです。
今回は、前回の続きです。
前回は、オシロスコープにつなぐ回路のお話をしました。Arduinoの6本の出力ピンから、R2Rラダー抵抗を通して、アナログ値で接続するものでした。
今回は、プログラム編です。
————————————————————————————————————-
//各変数の宣言 int i;
int j; int a=0; //出力用の変数(d0~d5)
int d0;int d1;int d2;int d3;int d4;int d5; int xy[38][16]=
{ //令和の設定
//Y0 1 2 3 4 5 6 7 8 9 101112131415
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},//X00
{0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},//X01
{0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0},//X02
{0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0},//X03
{0,0,1,0,0,0,1,0,1,0,0,1,0,0,0,0},//X04
{0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0},//X05
{0,0,0,0,1,0,1,0,1,1,1,1,1,0,0,0},//X06
{0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},//X07
{0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0},//X08
{0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X09
{0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0},//X10
{0,0,1,0,0,0,0,1,0,1,1,0,0,0,0,0},//X11
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},//X12
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},//X13
{0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0},//X14
{0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0},//X15
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//X16
{0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0},//X17
{0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},//X18
{0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0},//X19
{0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0},//X20
{0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0},//X21
{0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},//X22
{0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0},//X23
{0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0},//X24
{0,0,1,1,1,0,0,1,1,1,0,0,0,0,0,0},//X25
{0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X26
{0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X27
{0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0},//X28
{0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X29
{0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0},//X30
{0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0},//X31
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},//余白
};
void setup()
{ //ピンの入出力設定
pinMode(2,OUTPUT); pinMode(3,OUTPUT); pinMode(4,OUTPUT);
pinMode(5,OUTPUT); pinMode(6,OUTPUT); pinMode(7,OUTPUT);
pinMode(9,INPUT);
}
void loop()
{
for(j=0; j<38; j++) //横軸のループ
{
for (i=0; i<16; i++) //縦軸のループ
{
if(xy[j][i]==1) //その点で表示するか否か
{
a=i;
}else
{
a=0;
}
d0=a%2; //10進数で表した分解能を2進数のそれぞれの出力値に分解する
a=a/2;
d1=a%2;
a=a/2;
d2=a%2;
a=a/2;
d3=a%2;
a=a/2;
d4=a%2;
a=a/2;
d5=a%2;
a=a/2;
digitalWrite(7,d5); //それを出力する
digitalWrite(6,d4);
digitalWrite(5,d3);
digitalWrite(4,d2);
digitalWrite(3,d1);
digitalWrite(2,d0);
delayMicroseconds(2);
}
}
}
———————————————————————————————————-
プログラムは、たったこれだけです。
arduinoのプログラミングに関しては、下記で詳細を説明します。
************arduinoのプログラム記事のリンクはもう少々お待ちください***********
int xy[38][16]で配列により「令和元年」を記録しています。こちらは、下の図のように定義しています。縦軸をYで、上がY0、Y01、Y02とつづき、Y15までの計16bitの分解能です。横軸はXで表し、左からX00,X01X02とつづき、X31まで。の計32bitです。
しかし、実際に横軸を32bitだけで実行してしまうと、文字の両端は見切れてしまうので,X00より上と、X31より下に3行ずつ、オールゼロの桁をいれ、計38bitで構成しています。