特殊電子回路株式会社

 

 

特電について

トップ ページ製品情報ブログ「JTAG日記」JTAG情報会社紹介

インデックス

 ボード図面

 クイックスタート

 主な仕様

 GCCの使い方

 ダウンロード

 RXduinoについて

 JTAG ICE

 注文情報

 ご注意

 

サンプルコード

 サンプルコード集

 

フラクタルの描画

RX62Nには浮動小数点演算器が内蔵されているので、たまにはそれを駆使してみるのもいいでしょう。

MARYというボードの拡張ボード「OLED基板」に、RX62Nでマンデルブロー集合を描くデモを行ってみました。

次の動画をご覧下さい。

 

画面を1回更新するたびにピッピッピと音を鳴らすようにしています。

なお、コンパイルオプションは-O2をつけて最適化しています。

動画で見る

ArduinoやMARYとの速度の比較

下記の3種類のCPUで、速度を比較してみました。

@ 左上にあるのがMARYボード。NXPのLPC1114(ARM Cortex-M0)が乗っています。
A 左下にあるのがArduino UNO。ATMELのATMEGA328P@16MHzです。
B 右にあるのがRX-MEGA。ルネサスRX62N@96MHzが乗っています。

 

速度の対決の一部始終は、次のムービーをご覧ください。

MARYとArduinoUNOは、何故だかわかりませんが、ほぼ同じ速度でした。

 

MARYとArduinoが30秒ほどしてフラクタルの一部を苦戦しながら描いているときに、おもむろにRX62Nの電源を入れました。あっという間にRXがフラクタルを描いてしまいます。

 

MARYとArduinoUNOは、最初の1枚の絵を描くのに204秒かかります。しかし、RX62Nはわずか2秒しかかかりません。RX62Nの演算速度はArduinoやMARYのそれと比較すると約100倍です。

 

この差はクロック速度の差だけではありません。内蔵の浮動小数点演算器やアーキテクチャの素晴らしさによるものでしょう。RX62Nは圧倒的な速さです。気の短い江戸っ子にもお勧めです。
フィジカルコンピューティングに速度が必要だったら、迷わずにRX62Nでしょう。

 

 

コード(RXduino用)

#include <rxduino.h>
#include <stdlib.h>

// OLEDライブラリを使う
#include <oled.h>

int count = 0;
float mag;
float offsetx;
float offsety;

void setup()
{
  Serial.begin(38400);

  pinMode(PIN_SW,INPUT);
  pinMode(PIN_LED3,OUTPUT);

  Init_OLED(MARY2);
  OLED_printf_Font(OLED_FONT_MEDIUM);
  OLED_printf_Position(0, 0);
  OLED_printf_Color(OLED_WHT, OLED_BLK);

  OLED_printf_Font(OLED_FONT_MEDIUM);
  OLED_printf_Position(0, 1);
  OLED_printf_Color(OLED_WHT, OLED_BLK);
  OLED_printf(MARY2,"TOKUSHU");
  OLED_printf_Position(1, 3);
  OLED_printf_Color(OLED_YEL, OLED_BLK);
  OLED_printf(MARY2,"DENSHI");
  OLED_printf_Position(1, 5);
  OLED_printf_Color(OLED_BLU, OLED_BLK);
  OLED_printf(MARY2,"KAIRO");
  OLED_printf_Position(2, 7);
  OLED_printf_Color(OLED_CYN, OLED_BLK);
  OLED_printf(MARY2,"Inc.");

  delay(1000);
  offsetx = -0.756423894274328;
  offsety = 0.064179410646170;
  mag = 1;
}

void complex_mult(float ar,float ai,float br,float bi,
                          float *cr,float *ci) {
  // C = A * B
  *cr = ar * br - ai * bi;
  *ci = ar * bi + ai * br;
}

float complex_abs2(float r,float i) {
  float ar,ai;
  complex_mult(r,i,r,-i,&ar,&ai);
  return ar;
}

int generateColor(int count, int base) {
  int r,g,b;
  int d = (count % base) * 256 / base;
  int m = (int)(d / 42.667);

  switch(m) {
    case 0: r=0;g=6*d;b=255;break;
    case 1: r=0;g=255;b=255-6*(d-43);break;
    case 2: r=6*(d-86);g=255;b=0;break;
    case 3: r=255;g=255-6*(d-129);b=0;break;
    case 4: r=255;g=0;b=6*(d-171);   break;
    case 5: r=255-6*(d-214); g=0;b=255;break;
    default: r=0;g=0;b=0;break;
  }

  return (((r >> 3) & 0x1f) << 11) |
      (((g >> 2) & 0x3f) << 5) | ((b >> 3) & 0x1f);
}

void loop()
{
  OLED_move_position(MARY2,0,0);
  for(int y = 0;y < 128;y++) {
    for(int x = 0;x < 128;x++) {
      float cr = (x - 64) / 64. / mag + offsetx;
      float ci = (y - 64) / 64. / mag + offsety;
      float zr = 0;
      float zi = 0;
      int t;
      for(t=0;t<512;t++) {
        if(complex_abs2(zr,zi) > 4) break;
        complex_mult(zr,zi,zr,zi,&zr,&zi);
        zr += cr;
        zi += ci;
      }
      OLED_Send_Pixel(MARY2,generateColor(t,64));

    }
  }
  mag = mag * 1.2;
//  offsety += 0.001;
//  offsetx += 0.0016;

  if(count++ > 100)
  {
    count = 0;
    offsetx = -0.756423894274328;
    offsety = 0.064179410646170;
    mag = 1;
    count = 0;
  }
  for(int i=0;i<100;i++)
  {
    digitalWrite(PIN_LED3,i & 1);
    delayMicroseconds(300);
  }
}
                        

戻る

 


Copyright(C) 2011 TokushuDenshiKairo Inc. All rights reserved.