Processing+minimで波を鳴らす

 processingのライブラリにminimというものがあり、これでは音に関することが簡単に実装することができるようになります。
 今回はその中でもOscilという機能を使っていろいろな波を鳴らす方法です。
 デフォルトでならせる波は6種類あります。それそれ下図の左上から
  1. 正弦波
  2. 三角波
  3. ノコギリ波
  4. 矩形波
  5. 1/4パルス波
  6. フェーザ波
です。
blog
 それぞれ音を鳴らしたときの音色が違うので、目的にあった音を鳴らすことになります。
 これらの音をキーボードの1~6キーで買えられるようにしたテストプログラムを↓に書いておきます。実行すると画面に↑と同じ画面が現れそれぞれの440Hzの音が流れます。
  1. import ddf.minim.*;
  2. import ddf.minim.analysis.*;
  3. import ddf.minim.effects.*;
  4. import ddf.minim.signals.*;
  5. import ddf.minim.spi.*;
  6. import ddf.minim.ugens.*;

  7. Minim minim;
  8. AudioOutput out;
  9. Oscil oscil;

  10. void setup(){
  11.   size(1920, 1080);
  12.   minim = new Minim(this);
  13.   out = minim.getLineOut();//ここまでおまじない
  14.   oscil = new Oscil(440, 0.5, Waves.SINE);//oscilという変数に440Hzで大きさ0.5のsin波を挿入
  15.   oscil.patch(out);//oscilという変数を出力する".unpatch(out)"で出力を停止
  16.   noFill();
  17. }

  18. void draw(){
  19.   background(0);
  20.   
  21.   stroke(0, 0, 255);
  22.   strokeWeight(5);
  23.   beginShape();
  24.   for(int i = 0; i < width; i++){
  25.     vertex(i / 2, height / 2 - oscil.getWaveform().value(float(i) / (width)) * 100);//波形を描写(左半分)
  26.   }
  27.   for(int i = 0; i < width; i++){
  28.     vertex(width / 2 + i / 2, height / 2 - oscil.getWaveform().value(float(i) / (width)) * 100);//波形を描写(右半分)
  29.   }
  30.   endShape();
  31.   
  32.   stroke(255);
  33.   strokeWeight(1);
  34.   line(0, height / 2, width, height / 2);
  35. }

  36. void keyPressed(){//キーが押された時そのキーによってoscilの中の波形データを書き換える
  37.   switch(key){
  38.     case '1':
  39.       oscil.setWaveform(Waves.SINE);
  40.       break;
  41.     case '2':
  42.       oscil.setWaveform(Waves.TRIANGLE);
  43.       break;
  44.     case '3':
  45.       oscil.setWaveform(Waves.SAW);
  46.       break;
  47.     case '4':
  48.       oscil.setWaveform(Waves.SQUARE);
  49.       break;
  50.     case '5':
  51.       oscil.setWaveform(Waves.QUARTERPULSE);
  52.       break;
  53.     case '6':
  54.       oscil.setWaveform(Waves.PHASOR);
  55.       break;
  56.   }
  57. }

Processingで配列を定義する方法

 Processingで配列を定義する方法は↓のとおりです。Processingの配列はmatlabとかとは違い0から始まります。つまり、大きさが3の配列は0,1,2と番号を振られます。

int[][] matrix = new int[a][b];//a*b
このように定義をすることでa*bの配列を作ることができます。また、[]の数を増やすことで要素の数を増やすこともできますし、int型以外の例えばchar型やfloat型でも作ることができます。

 これを使った簡単な例を↓に書いておきます。
  1. int[][] matrix = new int[2][3];

  2. void setup() {
  3.   for (int j = 0; j < 3; j++) {
  4.     for (int i = 0; i < 2; i++) {
  5.       matrix[i][j] = i + j;
  6.     }
  7.   }
  8.   for (int j = 0; j < 3; j++) {
  9.     print("[");
  10.     for (int i = 0; i < 2; i++) {
  11.       print(matrix[i][j]);
  12.       if (i < 2 - 1) {
  13.         print(", ");
  14.       }
  15.     }
  16.     println("]");
  17.   }
  18. }
 このプログラムの出力は↓のようになります。
スクリーンショット 2021-01-04 181847

Processingで時間を表示(取得)する方法

 Processingで何かを作っていて、現在時刻を表示したいことがたまにあると思います。そうでなくても、現在時刻によって変化する作品を作ることはあると思います。それなので今回は例としてデジタル時計を作ってみます。

 使う関数は、hour(),minute(),second()です。その名の通りこれらはその瞬間の"時間""分""秒"を返してくれます。これを使ってデジタル時計を作ると↓のようになります。

スクリーンショット 2020-12-31 004041

 前に紹介したフォントの追加方法(http://blog.livedoor.jp/chisato_tofu/archives/25772956.html)を使っています。一応使ったプログラムを下に貼っておきます。適当に書いたのできれいじゃないのは許してください。
  1. PFont D14;
  2. String t;
  3. int s;
  4. int m;
  5. int h;

  6. void setup() {
  7.   size(320, 80);
  8.   strokeWeight(5);
  9.   colorMode(HSB, 360, 255, 255, 255);
  10.   D14 = createFont("DSEG14Modern-Regular.ttf", 60);
  11. }
  12. void draw() {
  13.   background(0);
  14.   textFont(D14);
  15.   stroke(0, 0, 255, 255);
  16.   fill(0, 0, 255, 255);
  17.   s = second();
  18.   m = minute();
  19.   h = hour();
  20.   if (h < 10) {
  21.     t = "0" + str(h);
  22.   }else{
  23.     t = str(h);
  24.   }
  25.   if (m < 10) {
  26.     t = t + ":" + "0" + str(m);
  27.   }else{
  28.     t = t + ":" + str(m);
  29.   }
  30.   if (s < 10) {
  31.     t = t + ":" + "0" + str(s);
  32.   }else{
  33.     t = t + ":" + str(s);
  34.   }
  35.   text(t, 0, 70);
  36. }

Processingで自作関数を定義する方法

プログラムが長くなってきたとき自分で関数を作ることがあると思うのですが、今回はProcessingでやる方法です。

 ↓のように書けば大丈夫です
  1. void setup(){
  2.   function1();
  3.   function2();
  4.   function3();
  5.   function4();
  6. }

  7. void function1(){
  8.   println("a");
  9. }
  10. void function2(){
  11.   println("b");
  12. }
  13. void function3(){
  14.   println("c");
  15. }
  16. void function4(){
  17.   println("d");
  18. }
 これを実行すると↓のようになります。
スクリーンショット 2020-12-28 232318


 ちなみに↓の画像の▽のマークをクリックすると出る"新規タブ"をクリックすると二ページ目が出せます。
スクリーンショット 2020-12-28 230905

 これを保存すると↓のように二つの.pdeとして保存されますが、どちらを開いても同じように起動できます。
スクリーンショット 2020-12-28 231937

Processingでランダムな数字を生成する(Random())

 Processingでランダムな数字を生成する方法です。プログラミングをしているとたまにランダムな数字が欲しいときがあり、その時はその環境に合わせた関数を使うのですが、今回はProcessingのRandom関数の使い方です。

 コードは下のとおりです。
  1. import java.util.Random;//Random関数のインポート
  2. Random random = new Random();//"random"という変数を定義

  3. void draw() {
  4.   int i = random.nextInt(255);//"i"という変数に0~255の間のランダムな値を挿入
  5.   println(i);//"i"を表示
  6. }
 これを実行すると↓のように0~255のランダムな値が連続して表示されます。
スクリーンショット 2020-12-28 215038

Processingで好きなフォントを使う方法(PFont)

Processingでフォントを使う時はPFontで指定するのですが、これで選べるフォントは結構少ないです。デフォルトで使えるフォントは、"ツール"->"フォント作成"で出てくるものだけです。結構あるように見えますが、デザインフォントは基本ないので好きなフォントを使えるわけではありません。それなので今回は好きなフォントを使えるようにする方法を紹介します。

①好きなフォントの.ttfファイルを用意する。
 この状態の単体のファイルを用意します。今回はこちらのサイト(https://www.keshikan.net/fonts.html)のフォントを利用させていただいています。
スクリーンショット 2020-12-23 225249

②用意した.ttfファイルを使いたいプログラムに配置する。
 ↓の画像のようにProcessingのファイル構成として、"ファイル"->"プログラム"という風に自動で保存されるのですが、"プログラム"と同じ階層に.ttfファイルを配置します。
スクリーンショット 2020-12-24 182601

③プログラムで読み込む。
 今回のテスト用のプログラムを↓に出しておきます。
  1. PFont D7;//配列を格納する変数を定義
  2. void setup() {
  3.   size(600, 400);
  4.   D7 = createFont("DSEG7ClassicMini-Regular.ttf", 60);//変数に"DSEG7ClassicMini-Regular.ttf"の60pのサイズのフォントを格納
  5. }

  6. void draw() {
  7.   background(0);
  8.   textFont(D7);//text()で表示するフォントをD7という変数に格納されているフォントに変更
  9.   textAlign(CENTER, CENTER);//text()で指定した座標を中心としたテキストボックスを作成
  10.   text("0123456789", width / 2, height / 2);//画面の真ん中に"0123456789"を表示
  11. }
 これを実行すると↓のようになります。
スクリーンショット 2020-12-25 172007

Processingだけでハッカーっぽい画面を作った話

なんとなく、Processingの中で完結するハッカーっぽい画面とそれに付随する映像を作ったので、その記事です。細かいのをちょくちょく出します。

 一応できたものとしては、ちょうど555行のコードを書いて↓みたいな映像を作りました。
 これからちょくちょく使った技術のメモを”ハッカーっぽい画面を作る”のタグで書いていこうと思います。

直流大電流をArduinoで測る方法(ACHS-7124)

 電動バイクを作っていて、インバータを作成する際にモーターに流れている電流を測定する必要があります。ただ、直接直流電流を測る方法は限られています。

 電流計測の方法としてよく出てくるのはCTセンサーを使う方法です。ただしこれは基本的に交流電流を測るものです。
 次に出てくる方法は、シャント抵抗を使用したものです。ただし、モーターにシャント抵抗を付けると燃えかねません。
 それなので、専用のモジュールを使います。

 今回は秋月でも売っている(https://akizukidenshi.com/catalog/g/gK-14796/)電流センサモジュールを使います。これは±40Aまで測れる優秀なヤツです。メーカーのページではいろいろ種類があって±50Vまでのチップもあったのですが、秋月で売っているものは±40V耐圧のようです。

 モジュールの使い方としては、基板に書いてある通りに配線します。
OUT-アナログ入力ピン
Vcc-5V
GND-GND
です。また、↓の画像のようにスルーホールに測りたい電流を流します。
Ep5zeLNVQAAPjgi

 プログラムは適当にanalogRead()で大丈夫です。公式サイトによると、2.5Vを中心に1Aあたり50mV変化するらしいのでmap(analogRead(),0,1023,-50,50)で電流が分かるはずです。ただし、ある程度の誤差とノイズは考慮してください。

 実際にanalogRead()でとった値をそのままシリアルプロッタに出力すると下のようになります。
スクリーンショット 2020-12-23 160317

 家にある直流安定化電源は数年前に買った安物で、3Aしか流せないのでほとんど変化がないうえにノイズが載っています。しかし、電流はきちんと測れているようです。

Seeeduino XIAO を使ってみた話

 私は、今月の初めにあったOMMF2020(https://www.iamas.ac.jp/ommf2020/)にて「朱守重工」で参加をしていたのですが、その際行われていたSeeedガチャにてSeeeduino XIAO をゲットしたので使ってみました。

 一つ目の特徴として、とても小さいという点が挙げられます。
 下に比較画像を載せていますが、左からArduino nano,Seeeduino XIAO,Raspberry Pi 3 Model B+です。これを見るとArduino nanoの半分ほどの大きさだとわかります。
AnyConv.com__Ep1-O-eUYAEskZu

 二つ目の特徴として、豊富なGPIOがそろっているという点が挙げられます。
 下の公式の紹介を見てわかるように11Analog/DigitalピンがありDAC出力にも対応しており、さらに通信ではI2C,UART,SPIが使用できます。通信のためにGPIOを使いすぎるとピン数が少なくなってしまうという欠点もありますが、使用用途的には問題ないと思います。
Seeeduino-XIAO-pinout


 三つ目の特徴として、使い勝手が良いという点が挙げられます。
 Arduino IDEを使えるのはもちろん、TinyUSBというライブラリを用いることでキーボードやマウスとして使用したり、CircuitPythonを利用したりできます。



 Arduino IDEでSeeeduino XAIOを使えるようにする方法は以下の通りです。
 ①"ファイル"->"環境設定"を開きます。すると下のような画面が出るので"追加のボードマネージャ"という欄に"https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json"をコピペします。
スクリーンショット 2020-12-22 225444

 ②"ツール"->"ボード"->"ボードマネージャー"を選択します。検索欄に"Seeeduino XIAO"と入れ検索し、出てきたパッケージをインストールします。
スクリーンショット 2020-12-22 230318

 ③"ツール"->"ボード"の中から"Seeeduino XIAO"を選択し、↓のように設定するとArduinoと同じように使用できます。

スクリーンショット 2020-12-22 230618


 最後にLチカをします。"ファイル"->"スケッチ例"->"01.Basics"->"Blink"を開いて書き込むとUSB Type Cの横のLEDが点滅します。実際に動かすと↓のようになります。

Jupyter Notebook(Anaconda3)でMatlabを使う方法

今回はJupyter内でMatlabを使う方法の説明です。環境はPython3.7,Anaconda3,Windowsです。

 まず、Matlabを起動しコマンドウィンドウで
"matlabroot"
を実行し、結果をメモしておきます。


 次にAnaconda Prompt (Anaconda3)を管理者権限で実行します。そうしたら以下のコマンドを立て続けに実行します。
conda create -vv -n jmatlab python=3.7 jupyter
activate jmatlab
pip install matlab_kernek
python -m matlab_kernel install
cd "「先ほどのmatlabrootの結果」\extern\engines\python"
python setup.py install

 これで設定が完了します。これができると下のように新規ファイルでMatlabが動かせるようになります。
 スクリーンショット 2020-10-27 215059


 あとはPythonと同じようにMatlabを使うことができます。試しにこの間のコードを実行してみると下のようにきちんと実行してくれます。
スクリーンショット 2020-10-27 215449
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード