三角関数は太陽検知にも使える!sin,cosで作ろう「おひさまデテクタ」!

三角関数は太陽検知にも使える!sin,cosで作ろう「おひさまデテクタ」!

先日作った「おひさまデテクタ」、もっとカッコよく検知したいと思い、今回はプログラムを全面改良。

どうでしょう?速度もいいし、動きもカッコよくなりました。

無理やり向きを変えても、すぐにおひさまをデテクトしてくれます。

タイムラプスで太陽を追いかけてみました。いいところでカメラのバッテリー切れ。。。でも、なかなかいい感じ。

そしてもちろん「ひまわり」もできちゃいます。

var HC=1500, VC=1500;
var HA=2200, VA=2200;
var HI= 900, VI= 800;

var hc=HC, vc=VC;
var r=HA-HC;

while(1){
 led(1);

 while(32<r){
  r=r*3/5;
  var b=0, hcn=hc, vcn=vc;
  var d=0;
  while(d<360){
   var h=((sin8(d+90)*r)>>8)+hc;
   var v=((sin8(d   )*r)>>8)+vc;
   pwm(4,h);pwm(3,v);
   sleep(8);
   var a=ana(2);
   if(b<a){
    b=a; hcn=h; vcn=v;
   }
   d=d+6;
  }

  hc=hcn;
  if(hc<HI) hc=HI;
  if(HA<hc) hc=HA;
  vc=vcn;
  if(vc<VI) vc=VI;
  if(VA<vc) vc=VA;
 }

 pwm(4,hc);pwm(3,vc);
 sleep(33);
 led(0);

 var th=ana(2)*95/100;
 while(th<ana(2));

 r=r<<3;
}

今回改良したプログラムはこんな感じ。三角関数sin,cosはおひさま検知にも有用!

サーボとセンサーの練習に「ししまいロボット」、発売開始!










.

おひさまを捕捉せよ!IchigoJamによるエネルギー源探知システム!

おひさまを捕捉せよ!IchigoJamによるエネルギー源探知システム!

連日の猛暑、もうバテバテ。

これだけのエネルギー源「おひさま」を捉えるため、作ったのは「おひさまデテクタ」。サーボを2つひっ付けて水平方向と垂直方向に動作可能。3vで動作するFT30B、コンパクトに仕上がって便利っ。

そして筒の中には明るさセンサーCdS

var step=8;

while(1){
 led(1);

 pwm(3,1900);
 pwm(4,2200);
 sleep(1000);

 // vertical
 var max_b=0;

 var i=2200;
 var max_dv=i;
 while(800<=i){
  pwm(4,i); sleep(33);
  var b=ana(2);
  if(max_b<b){
   max_b=b;
   max_dv=i;
  }
  i=i-step;
 }

 pwm(4,max_dv); sleep(500);

 // horizontal
 max_b=0;

 i=2200;
 var max_dh=i;
 while(800<=i){
  pwm(3,i); sleep(33);
  var b=ana(2);
  if(max_b<b){
   max_b=b;
   max_dh=i;
  }
  i=i-step;
 }

 pwm(3,max_dh); sleep(500);

 led(0);

 // wait btn
 while(!btn());
 sleep(333);
}

ひとまず作ったプログラムはこんな感じのIchigoLatte JS。CdSでグルっと辺りを見回して、最終的に一番明るいところに向く、というもの。BASICでも同じことできるはず。

熱源捕捉、成功!

もっと かっこよく デテクトしたいところ。










.

好きな言語で作れる、たった182byteのLatteアプリ!IchigoLatte JS 1.2.0 正式版リリース!

好きな言語で作れる、たった182byteのLatteアプリ!IchigoLatte JS 1.2.0 正式版リリース!

IchigoLatte 1.2.0 リリースIchigoDake版はこちら)、今回の改良点はこちら。

* [cat] argument "-c"(count) is available.
* [lash] '.' and '_' added.
* [] API table added on 0xC0.(see api.h)

先日実装した「実行バイナリ直接実行機能」が追加されています。

IchigoLatte JS は「JavaScript でプログラミングできる小さなパソコン」ですが、もしラップトップなどのPCやmacがあるならば、お好きな言語、お好きなエディタで Latteアプリ を作れるようになりました。(arm thumbを吐ける環境必要)

#include "latte.h"

void _start(){
  while(1){
    latte.io_led(1); latte.sleep(333, 0);
    latte.io_led(0); latte.sleep(333, 0);
  }
}

例えばC言語でLチカするならこんな感じ。「latte」オブジェクトが IchigoLatte OSのAPIを提供しています。あとは make して転送、超簡単!(要:arm-gcc

typedef struct{
    // ichigolatte
    volatile int32_t* g_env;
    volatile uint64_t* g_msec;
    size_t  (*mem_check)();
    void*   (*mem_alloc)(size_t size);
    void    (*mem_free)(void* mem);
    int  (*timer_set)(size_t usec, void (*func)());
    uint32_t (*rand_get)();
    int32_t (*sin8)(int32_t d);
    int32_t (*div)(int32_t n, int32_t d);
    int32_t (*mod)(int32_t n, int32_t d);
    ssize_t (*read)(int fd, void *buf, size_t count);
    ssize_t (*write)(int fd, const void *buf, size_t count);
    int         (*flash_erase)(uint8_t num);
    int         (*flash_save)(uint8_t num, const void* buf, size_t size);
    const char* (*flash_load)(uint8_t num);
    void    (*uart_bps)(uint32_t bps);
    void    (*uart_send)(const uint8_t* buf, size_t len);
    int32_t (*uart_read)();
    int (*i2c)(uint8_t wbf[], size_t nwb, uint8_t rbf[], size_t nrb);
    int     (*io_led)(int nf);
    int     (*io_btn)();
    int     (*io_in)(int n);
    int     (*io_ana)(int n);
    void    (*io_out)(int n);
    void    (*io_pwm)(int n, uint32_t d);
    void    (*io_pwmt)(uint32_t t);
    void    (*io_beep)(uint32_t hz, uint32_t msec);
    void  (*sleep)(int msec, int deep);
    char* (*line)(const char* last, size_t len);
    void  (*reset)();
    void (*ntsc_onoff)(int n);

    // screen
    const uint8_t (*g_aFont)[8];
    unsigned char* g_aScreen;
    uint8_t* g_nCursorX;
    uint8_t* g_nCursorY;
    unsigned char* (*screen_buf)(uint8_t x, uint8_t y);
    void (*screen_regulize)();
    void (*screen_clear)();
    void (*screen_scroll_l)();
    void (*screen_scroll_r)();
    void (*screen_scroll_u)();
    void (*screen_scroll_d)();
    void (*screen_putc)(unsigned char c);
    void (*screen_puts)(const char* s);
    
    // keyboard
    int (*keyboard_enqKeyBuf)(uint8_t k);
    uint8_t (*keyboard_deqKeyBuf)();

    // library - stdio.c
    int (*atoi)(const char* s);
    signed int (*printf)(const char *pFormat, ...);
    int (*snprintf)(char *pString, size_t length, const char *pFormat, ...);

    // library - string.c
    void* (*memcpy)(void* dst, const void* src, size_t n);
    void* (*memset)(void* b, int c, size_t len);
    char* (*strncpy)(char* dst, const char* src, size_t len);
    int (*strncmp)(const char* s1, const char* s2, size_t n);
    size_t (*strlen)(const char* s);
} API;

Latte内部の機能たち、割り算も含めてひとまず使いそうなものをAPIとして公開してみました。「あれはないの?」とかありましたらご連絡ください。

#include "latte.h"

#define ON_THE_GROUND   99
#define KEY_SPACE       32
#define CENTER          15
#define GROUND          22



void _start(){
    // Initialize
    const int32_t sacchanX = CENTER;
          int32_t sacchanY = GROUND-6;
          int32_t sacchanV = 0;                 // Current Speed
          int32_t sacchanJ = -3;                // Jump Power
          int32_t nawaX = CENTER;
    const int32_t nawaY = GROUND;
          int32_t nawaV = 5;                    // Current Speed
          int32_t gravity = 1;
          int32_t slowness = 66;
          int32_t landingCount = 0;

    // Game loop
    while(!(  (sacchanX==nawaX) && (sacchanY==nawaY)  )){
        // Check Jumping key
        if(latte.keyboard_deqKeyBuf() == KEY_SPACE){
            sacchanV = sacchanJ;
        }

        // Move the Sacchan
        if(sacchanV != ON_THE_GROUND){
            sacchanY += sacchanV;
            if(GROUND < sacchanY){
                // Landed
                sacchanV = ON_THE_GROUND;
                sacchanY = GROUND;
                landingCount += 1;
            }else{
                sacchanV += gravity;
            }
        }

        // Move the Nawa
        nawaX += nawaV;
        nawaV += (nawaX<CENTER) - (CENTER<nawaX);

        // Draw
        latte.screen_clear();
        latte.printf("SCORE:%d\n", landingCount);
        *latte.screen_buf(sacchanX, sacchanY) = '@';
        *latte.screen_buf(nawaX, nawaY) = '-';

        // Show slowly to player
        latte.sleep(slowness, 0);
    }
}

名作「縄跳び さっちゃん」のC言語バージョンはこちら、たった182byte!

みなさんもお好きな言語でIchigoLatteアプリ、作ってみてね!











.

安心安全「Zen言語」で作る IchigoLatteアプリ!2Dぐるぐる🌀できる バージョン 1.2.0β リリース!

安心安全「Zen言語」で作る IchigoLatteアプリ!2Dぐるぐる🌀できる バージョン 1.2.0β リリース!

JavaScriptプログラミングを学習できる中高生向けIchigoJamIchigoLatte JS」、Zen言語で作ったプログラムも動くようにバージョンアップ中。

usingnamespace @import("latte.zen");

export fn _start() void {
  while(true){
    _ = latte.io_led(1);
    latte.sleep(500, 0);
    _ = latte.io_led(0);
    latte.sleep(500, 0);
  }
}

こちらはZen言語版 Lチカ 、”latte.zen” を @import してAPI “latte” を呼ぶだけ。これを make してできる実行バイナリは 40byte !

実行バイナリを IchigoLatte に転送するには、

lash> cat -c 40 uart > .

lashでこれを叩いて40byteのバイナリ待ち状態にして、uart接続されたPCからTX。

CoolTermならバイナリファイルをDrag&Dropするだけ。

lash> .

バイナリの実行は “.” エンター。

Zen言語でLチカ成功!

せっかくのZen言語、もっと楽しいものを作りましょう。

usingnamespace @import("latte.zen");

export fn _start() void {
  var cX:i8 = 16;
  var cY:i8 = 12;

  var d1:i32 = 90;
  var d2:i32 = 210;
  var d3:i32 = 330;
  var r:i32 = 8;
  var d:i32 = 0;
  var s:i32 = 1;

  while(true){
    latte.screen_clear();
    line(
      @intCast(i8, (r*latte.sin8(d+d1+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d1))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d2+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d2))>>8) + cY
    );
    line(
      @intCast(i8, (r*latte.sin8(d+d2+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d2))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d3+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d3))>>8) + cY
    );
    line(
      @intCast(i8, (r*latte.sin8(d+d3+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d3))>>8) + cY,
      @intCast(i8, (r*latte.sin8(d+d1+90))>>8) + cX,
      @intCast(i8, (r*latte.sin8(d+d1))>>8) + cY
    );

    latte.sleep(3, 0);

    var k:u8 = latte.keyboard_deqKeyBuf();
    if(k == 32){
      break;
    }else
    if(k == 30){
      s += 1;
    }else
    if(k == 31){
      s -= 1;
    }else
    {}

    d += s;
  }
}

fn _abs(x:i32) u32{
  return @intCast(u8, (if(0<x) x else -x));
}

fn _div(n:i32, d:i32) i32{
  return if(d != 0) latte.div(n, d) else n;
}

fn _dot(x:i32, y:i32) void{
  if( (0<=x and x<32) and (0<=y and y<24) ){
    latte.screen_buf(@intCast(u8,x), @intCast(u8,y)).* = '*';
  }
}

fn line(x1:i8, y1:i8, x2:i8, y2:i8) void{
  var dx:i32 = (x2 - x1);
  var dy:i32 = (y2 - y1);
  if(_abs(dx) < _abs(dy)){
    if(y1 < y2){
      var i:i32 = 0;
      while(y1+i <= y2){
        _dot(x1+_div(dx*i,dy), y1+i);
        i += 1;
      }
    }else{
      var i:i32 = 0;
      while(y2+i <= y1){
        _dot(x2+_div(dx*i,dy), y2+i);
        i += 1;
      }
    }
  }else{
    if(x1 < x2){
      var i:i32 = 0;
      while(x1+i <= x2){
        _dot(x1+i, y1+_div(dy*i,dx));
        i += 1;
      }
    }else{
      var i:i32 = 0;
      while(x2+i <= x1){
        _dot(x2+i, y2+_div(dy*i,dx));
        i += 1;
      }
    }
  }
}

これは3角形がぐるぐる回るプログラム、矢印キー上下で回転速度を変更可能。

このサンプルはgithubからどうぞ。実行バイナリを直接実行できる IchigoLatte JS 1.2.0 beta はこちら(Normal, forDake)からどうぞ。

型に厳密で安全志向プログラミング言語「Zen」、エッジ開発に最適かも!









.

[see also]