WioTerminal できょろきょろしてみた。

前回記事でサーボモータのコントロールができるようになったので、これを使って、きょろきょろしてみた。
f:id:manpukukoji:20200724090907j:plain
特に、なんの役にもたちません。
ただ、視線を右や左に移し、それに応じてそっちを向くというものです。
首を振る動きに合わせて、目線も正面に戻ってくるというもの。
どうでしょう? 思惑どうりにできてるかな?

以下、スケッチ
前回記事で、ライブラリ化していなければ、前回記事のヘッダとソースが必要です。
manpuku-koji.hatenablog.com

 

#include <LovyanGFX.hpp>
#include "MyServo.h"

int outpin=D2;
MyServo servo(outpin);

static LGFX lcd;
static LGFX_Sprite sprite(&lcd);

void drawEye(int x, int y) {
  sprite.clear();
  sprite.fillCircle(65,65,60,0xFFFF);
  //sprite.drawEllipse(65,65,60,30,0xFFFF);
  //sprite.drawFastHLine(5,62,120,0xFF);
  sprite.fillCircle(x,y,15,0);
  sprite.fillArc(65,65,60,1,180,360,0xED6E);
  sprite.setPivot(65,65);
  sprite.pushRotateZoom(80,70,0,1,0.5);
  sprite.pushRotateZoom(240,70,0,1,0.5);
}

void sleepyEyes() {
  int p_rect[4][4] = {{9,65,112,22},{22,65,86,41},{40,65,49,55},{63,65,4,59}};
  sprite.clear();
  sprite.fillCircle(65,65,60,0xFFFF);
  sprite.fillCircle(65,70,10,0);
  //sprite.fillArc(65,65,60,1,180,360,0xED6E);
  sprite.setPivot(65,65);
  for (int i=0;i<4;i++) {
    sprite.fillArc(65,65,60,1,180,360,0xED6E);
    sprite.fillArc(65,65,60,1,0,22*(i+1),0xED6E);
    sprite.fillArc(65,65,60,1,180-(22*(i+1)),180,0xED6E);
    sprite.fillRect(p_rect[i][0],p_rect[i][1],p_rect[i][2],p_rect[i][3],0xED6E);
    sprite.pushRotateZoom(80,70,0,1,0.5);
    sprite.pushRotateZoom(240,70,0,1,0.5);
    delay(200);
  }
  delay(2000);
  //sprite.pushRotateZoom(80,70,0,1,0.5);
  //sprite.pushRotateZoom(240,70,0,1,0.5);
}

void setup() {
  pinMode(WIO_5S_UP, INPUT_PULLUP);
  pinMode(WIO_5S_DOWN, INPUT_PULLUP);
  
  lcd.init();
  lcd.setRotation(1);
  lcd.setBrightness(128);
  lcd.setColorDepth(16);
  lcd.clear();

  sprite.setColorDepth(16);
  sprite.createSprite(130, 130);
  drawEye(115,75);
  lcd.drawArc(160,90,120,119,30,150,0xE800);
  
}

int counter = 0;

void loop() {
  int x = random(15, 115);
  drawEye(x,70);
  if ( x > 65){
    for (int pos = x; pos > 65; pos--) {
      drawEye(pos,75);
      servo.write0(90+(x-pos)*1.5);
    }
  }
  else {
    for (int pos = x; pos < 65; pos++) {
      drawEye(pos,75);
      servo.write0(90-(pos-x)*1.5);
    }    
  }
  delay(1000);
  servo.write0(90);
  delay(random(5000));
  counter++;
  if (counter>10){
    counter = 0;
    sleepyEyes();
  }
}