Nao_uの日記 このページをアンテナに追加 RSSフィード

2020-01-18

待望のUE4新機能ナイアガラでプログラマブルVFX - Epic Games Japan - GTMF 2018 TOKYO 待望のUE4新機能ナイアガラでプログラマブルVFX - Epic Games Japan - GTMF 2018 TOKYO - Nao_uの日記 を含むブックマーク はてなブックマーク - 待望のUE4新機能ナイアガラでプログラマブルVFX - Epic Games Japan - GTMF 2018 TOKYO - Nao_uの日記 待望のUE4新機能ナイアガラでプログラマブルVFX - Epic Games Japan - GTMF 2018 TOKYO - Nao_uの日記 のブックマークコメント

そろそろNiagara触っておかないと…

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200118

2020-01-13

micro:bitでUARTのBLE通信!WebBluetoothAPIでThree.jsを操作する micro:bitでUARTのBLE通信!WebBluetoothAPIでThree.jsを操作する - Nao_uの日記 を含むブックマーク はてなブックマーク - micro:bitでUARTのBLE通信!WebBluetoothAPIでThree.jsを操作する - Nao_uの日記 micro:bitでUARTのBLE通信!WebBluetoothAPIでThree.jsを操作する - Nao_uの日記 のブックマークコメント

micro:bit側のBLE通信のサンプル

こっちの方が適切かも。BLE受信してる

M5StackとM5StickC間のarduino BLE通信 M5StackとM5StickC間のarduino BLE通信 - Nao_uの日記 を含むブックマーク はてなブックマーク - M5StackとM5StickC間のarduino BLE通信 - Nao_uの日記 M5StackとM5StickC間のarduino BLE通信 - Nao_uの日記 のブックマークコメント

M5Stack側のBLE通信のサンプル

両方を合わせて、とりあえず接続するところまでは行けた。


このリファレンスとても参考になる


Characteristic: uuid: 6e400002-b5a3-f393-e0a9-e50e24dcca9e, handle: 39 0x0027, props: broadcast: 0, read: 0, write_nr: 0, write: 0, notify: 0, indicate: 1, auth: 0

Characteristic: uuid: 6e400003-b5a3-f393-e0a9-e50e24dcca9e, handle: 42 0x002a, props: broadcast: 0, read: 0, write_nr: 1, write: 1, notify: 0, indicate: 0, auth: 0

  • 6e400002 で接続して、std::string myValue = pRemoteCharacteristic->readValue(); でmicro:bitからの文字列を受信できた。
  • が、なぜかAボタンとBボタンをどちらからでも順に押すとmicro:bit020のエラーが出ての再起動がかかる

ESP32@arduino ideとmicrobitのBLE通信 ESP32@arduino ideとmicrobitのBLE通信 - Nao_uの日記 を含むブックマーク はてなブックマーク - ESP32@arduino ideとmicrobitのBLE通信 - Nao_uの日記 ESP32@arduino ideとmicrobitのBLE通信 - Nao_uの日記 のブックマークコメント

なんかいろいろ書き換えたら動くと書いてある。試す


ESP32とBLE HIDデバイスを接続する方法(ESP32 1.0.4更新) ESP32とBLE HIDデバイスを接続する方法(ESP32 1.0.4更新) - Nao_uの日記 を含むブックマーク はてなブックマーク - ESP32とBLE HIDデバイスを接続する方法(ESP32 1.0.4更新) - Nao_uの日記 ESP32とBLE HIDデバイスを接続する方法(ESP32 1.0.4更新) - Nao_uの日記 のブックマークコメント

コントローラーの接続

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200113

2020-01-12

グラスをスマートにする技術~その3:ESP-Now~ グラスをスマートにする技術~その3:ESP-Now~ - Nao_uの日記 を含むブックマーク はてなブックマーク - グラスをスマートにする技術~その3:ESP-Now~ - Nao_uの日記 グラスをスマートにする技術~その3:ESP-Now~ - Nao_uの日記 のブックマークコメント

ESP-NOWは、短いパケットを特徴とする高速でコネクションレスな通信技術送信です。 ESP-NOWはスマートライト、リモコン、センサーなどのアプリケーションに最適です。

 ESP-NOWはIEEE802.11 Action Vendorフレーム技術とEspression if社が開発したCCMP暗号化技術により、コネクションレス通信を実現します。Wifiと比べて立ち上げ時間・通信時間がとても高速で、ロボットを制御する用途では、通信の遅延が少ないので、制御性がよくなるメリットがありま

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200112

2020-01-11

Micro:bitのPythonでモータードライバを動かすサンプル Micro:bitのPythonでモータードライバを動かすサンプル - Nao_uの日記 を含むブックマーク はてなブックマーク - Micro:bitのPythonでモータードライバを動かすサンプル - Nao_uの日記 Micro:bitのPythonでモータードライバを動かすサンプル - Nao_uの日記 のブックマークコメント

これのアドレスをSuper:Bitのmain.tsに合わせて書き換えると動きそう

このサンプルも参考になる

http://wiki.labplus.cn/index.php?title=Extend:bit%E2%85%A1

これで動いた

# Add your Python code here. E.g.
from microbit import *

PCA9685_ADDRESS = 0x40   #device address

#define register
MODE1 = 0x00
MODE2 = 0x01
SUBADR1 = 0x02
SUBADR2 = 0x03
SUBADR3 = 0x04

PRESCALE = 0xFE

LED0_ON_L = 0x06
LED0_ON_H = 0x07
LED0_OFF_L = 0x08
LED0_OFF_H = 0x09
ALL_LED_ON_L = 0xFA
ALL_LED_ON_H = 0xFB
ALL_LED_OFF_L = 0xFC
ALL_LED_OFF_H = 0xFD

STP_CHA_L = 2047
STP_CHA_H = 4095
STP_CHB_L = 1
STP_CHB_H = 2047
STP_CHC_L = 1023
STP_CHC_H = 3071
STP_CHD_L = 3071
STP_CHD_H = 1023

# Servos define 
S1 = 0x01
S2 = 0x02
S3 = 0x03
S4 = 0x04
# Motors define
M1 = 8
M2 = 10
M4 = 12
M3 = 14


# device init
def initPCA9685(): 
    i2c.write(PCA9685_ADDRESS, bytearray([MODE1, 0x00]))
    setFreq(50)
    for idx in range(0, 16, 1):
        setPwm(idx, 0 ,0)
    #initialized = true

#set frequency    
def setFreq(freq):
    #Constrain the frequency
    prescaleval = int(25000000/(4096*freq)) - 1
    #prescale = prescaleval;  #Math.Floor(prescaleval + 0.5)
    i2c.write(PCA9685_ADDRESS, bytearray([MODE1]))
    oldmode = i2c.read(PCA9685_ADDRESS, 1)
    newmode = (oldmode[0] & 0x7F) | 0x10  # sleep
    i2c.write(PCA9685_ADDRESS, bytearray([MODE1, newmode])) # go to sleep
    i2c.write(PCA9685_ADDRESS, bytearray([PRESCALE, prescaleval]))  # set the prescaler
    i2c.write(PCA9685_ADDRESS, bytearray([MODE1, oldmode[0]]))
    sleep(4)
    i2c.write(PCA9685_ADDRESS, bytearray([MODE1, oldmode[0] | 0xa1]))

# function: setPwm()     
def setPwm(channel, on, off):
    if (channel >= 0 and channel <= 15):
        buf = bytearray([LED0_ON_L + 4 * channel, on & 0xff, (on >> 8) & 0xff, off & 0xff, (off >> 8) & 0xff])
        i2c.write(PCA9685_ADDRESS, buf)

# function: motorRun()
# @param motor:  M1A, M1B, M2A, M2B
# @param speed1: -255 - 255  0 is stop      
def MotorRun(Motors, speed):
    speed = speed * 16  # map 255 to 4096
    if (speed >= 4096):
        speed = 4095
    if (speed <= -4096):
        speed = -4095
    
    a = Motors
    b = Motors+1
    if (speed >= 0):
        setPwm(a, 0, speed)
        setPwm(b, 0, 0)
    else :
        setPwm(a, 0, 0)
        setPwm(b, 0, -speed)
    

while True:
    initPCA9685()
    display.show(Image.HEART)
    
    for idx in range(0, 120, 1):
        display.show(idx%10)
        #MotorRun(M1, idx)
        sleep(16)

M5CameraでGoogle Driveにアップロードする M5CameraでGoogle Driveにアップロードする  - Nao_uの日記 を含むブックマーク はてなブックマーク - M5CameraでGoogle Driveにアップロードする  - Nao_uの日記 M5CameraでGoogle Driveにアップロードする  - Nao_uの日記 のブックマークコメント

やってみたい

micro:bitをWeb Bluetooth APIで通信するときにハマったポイント micro:bitをWeb Bluetooth APIで通信するときにハマったポイント - Nao_uの日記 を含むブックマーク はてなブックマーク - micro:bitをWeb Bluetooth APIで通信するときにハマったポイント - Nao_uの日記 micro:bitをWeb Bluetooth APIで通信するときにハマったポイント - Nao_uの日記 のブックマークコメント

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200111

2020-01-07

[Micro:bit] Bluetooth関連の調査 [Micro:bit] Bluetooth関連の調査 - Nao_uの日記 を含むブックマーク はてなブックマーク - [Micro:bit] Bluetooth関連の調査 - Nao_uの日記 [Micro:bit] Bluetooth関連の調査 - Nao_uの日記 のブックマークコメント

「Buetooth?のジョイスティックコントローラの入力をMicro:bitに伝えたい」

https://tangowhisky37.github.io/KidzCanCode-Tutorials-I/docs/motor_bit_smart_car_case_06.html


micro:bitをWeb Bluetooth APIで通信するときにハマったポイント micro:bitをWeb Bluetooth APIで通信するときにハマったポイント - Nao_uの日記 を含むブックマーク はてなブックマーク - micro:bitをWeb Bluetooth APIで通信するときにハマったポイント - Nao_uの日記 micro:bitをWeb Bluetooth APIで通信するときにハマったポイント - Nao_uの日記 のブックマークコメント

micro:bitでBluetooth micro:bitでBluetooth - Nao_uの日記 を含むブックマーク はてなブックマーク - micro:bitでBluetooth - Nao_uの日記 micro:bitでBluetooth - Nao_uの日記 のブックマークコメント

https://oretopia.net/blog/2018/1110a/

MicroBitが受信するときはBLEのUARTサービスを使うのが良さそう

GoogleのEddystoneとはなんなのか GoogleのEddystoneとはなんなのか - Nao_uの日記 を含むブックマーク はてなブックマーク - GoogleのEddystoneとはなんなのか - Nao_uの日記 GoogleのEddystoneとはなんなのか - Nao_uの日記 のブックマークコメント

M5StackのBLEScanResults/BLEAdvertisedDeviceはeddystoneを解析できない?

届いた生データを見たいが、別の形式で解釈済みで生データが消えてる(payloadがたまたま開放済みメモリを指してた時に生データっぽいものが偶然見えることがあるが、たぶん不正なアクセス)

生データを取る方法が欲しい


M5StackでRCサーボを動かす M5StackでRCサーボを動かす - Nao_uの日記 を含むブックマーク はてなブックマーク - M5StackでRCサーボを動かす - Nao_uの日記 M5StackでRCサーボを動かす - Nao_uの日記 のブックマークコメント

M5StackではArduinoの定番のServo.hが使えません.

ここに描いてあるLED制御用のPWMでサーボが動いた。

Esp32Surbo が使えるらしい。

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200107

2020-01-06

メモ:床暖房の光熱費 メモ:床暖房の光熱費 - Nao_uの日記 を含むブックマーク はてなブックマーク - メモ:床暖房の光熱費 - Nao_uの日記 メモ:床暖房の光熱費 - Nao_uの日記 のブックマークコメント

  • 部屋を閉め切った場合
    • 1枚で4~5円/h
      • 1枚24hで110円
      • 2枚24hで220円
  • リビング階段の扉を開けてた場合
    • 1枚で8.75円/h (0時~8時で計測)
      • 朝に外が10度で室内が21度、4度低下
    • 風呂が含まれて間違いかも。再計測
      • メモ:朝八時段階で146円、室温21度
      • 12時間後に240円、室温18度

1/17追記:

  • 寒い日、0時~8時半/2枚で130円 (外気温4度、室温17度で7.5円/h)
トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200106

2020-01-05

当面の課題

  • 加速度センサの使い方を調べておく
  • M5StackをMicro:Bitのユニバーサル基盤経由でSuper:Bitに接続して代替
  • cameraが届いたら映像を送る(が、難度はだいぶ高そうなのでスマホで妥協したほうがいいかも)
  • PS3コントローラーの接続

M5cameraでWebカメラを作る M5cameraでWebカメラを作る - Nao_uの日記 を含むブックマーク はてなブックマーク - M5cameraでWebカメラを作る - Nao_uの日記 M5cameraでWebカメラを作る - Nao_uの日記 のブックマークコメント

https://ambidata.io/samples/m5stack/m5camera/


Arduino(M5StickC)でefont Unicodeフォント表示 完結編 Arduino(M5StickC)でefont Unicodeフォント表示 完結編 - Nao_uの日記 を含むブックマーク はてなブックマーク - Arduino(M5StickC)でefont Unicodeフォント表示 完結編 - Nao_uの日記 Arduino(M5StickC)でefont Unicodeフォント表示 完結編 - Nao_uの日記 のブックマークコメント

https://lang-ship.com/blog/?p=646

「AquesTalk-ESP32 Ver.2.0」を使う 「AquesTalk-ESP32 Ver.2.0」を使う - Nao_uの日記 を含むブックマーク はてなブックマーク - 「AquesTalk-ESP32 Ver.2.0」を使う - Nao_uの日記 「AquesTalk-ESP32 Ver.2.0」を使う - Nao_uの日記 のブックマークコメント

http://blog-yama.a-quest.com/?eid=970195

PLEN:bit:M5Stackと接続 PLEN:bit:M5Stackと接続 - Nao_uの日記 を含むブックマーク はてなブックマーク - PLEN:bit:M5Stackと接続 - Nao_uの日記 PLEN:bit:M5Stackと接続 - Nao_uの日記 のブックマークコメント

http://shikarunochi.matrix.jp/?p=3295

Micro:bitと同じ形状のユニバーサル基盤があった


M5Stack同士でWiFi, UDPによる双方向リアルタイム同時通信する実験 M5Stack同士でWiFi, UDPによる双方向リアルタイム同時通信する実験 - Nao_uの日記 を含むブックマーク はてなブックマーク - M5Stack同士でWiFi, UDPによる双方向リアルタイム同時通信する実験 - Nao_uの日記 M5Stack同士でWiFi, UDPによる双方向リアルタイム同時通信する実験 - Nao_uの日記 のブックマークコメント

https://www.mgo-tec.com/blog-entry-udp-wifi-m5stack.html

M5Stackの3Dソフトウェアラスタライザ M5Stackの3Dソフトウェアラスタライザ - Nao_uの日記 を含むブックマーク はてなブックマーク - M5Stackの3Dソフトウェアラスタライザ - Nao_uの日記 M5Stackの3Dソフトウェアラスタライザ - Nao_uの日記 のブックマークコメント

https://twitter.com/gyabo/status/1112397505667293184

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200105

2020-01-04

M5Stackを分解したり電源を入れてみて、いろいろ思ったこと M5Stackを分解したり電源を入れてみて、いろいろ思ったこと - Nao_uの日記 を含むブックマーク はてなブックマーク - M5Stackを分解したり電源を入れてみて、いろいろ思ったこと - Nao_uの日記 M5Stackを分解したり電源を入れてみて、いろいろ思ったこと - Nao_uの日記 のブックマークコメント

https://www.mgo-tec.com/blog-entry-m5stack-initial-operation.html

Arduino IDEのビルドを速くする|オブジェクトファイルの出力先を固定する Arduino IDEのビルドを速くする|オブジェクトファイルの出力先を固定する - Nao_uの日記 を含むブックマーク はてなブックマーク - Arduino IDEのビルドを速くする|オブジェクトファイルの出力先を固定する - Nao_uの日記 Arduino IDEのビルドを速くする|オブジェクトファイルの出力先を固定する - Nao_uの日記 のブックマークコメント

PACMAN with M5STACK PACMAN with M5STACK - Nao_uの日記 を含むブックマーク はてなブックマーク - PACMAN with M5STACK - Nao_uの日記 PACMAN with M5STACK - Nao_uの日記 のブックマークコメント

Gameboy Panel は ATmega328P で構成され I2C で通信しています。

アドレスは 0x88 です。

サンプル(faces_joystick)ではなぜか#define FACE_JOY_ADDR 0x5e で定義されていてそのままでは動かず、0x88にしたら動いた

…と思ったけど、なんかそもそも別のサンプルっぽい?アナログを取ってる気配が。


#include <M5Stack.h>

#define FACE_JOY_ADDR 0x88

#define KEY_U   0x01
#define KEY_D   0x02
#define KEY_L   0x04
#define KEY_R   0x08
#define KEY_A   0x10
#define KEY_B   0x20
#define KEY_SL  0x40
#define KEY_ST  0x80

char strBuf[100];

int cnt=0;
void setup() {
  randomSeed(analogRead(0));
  Serial.begin(115200);
  M5.begin();
  Wire.begin();
  M5.Lcd.fillScreen(TFT_BLACK);
  pinMode(5, INPUT_PULLUP);
  delay(100);
    
  M5.Lcd.setTextFont(2);
}

uint8_t key_val;
void loop() {
  M5.Lcd.fillScreen(TFT_BLACK);
  if(digitalRead(5) == LOW) {
      cnt++;
      Wire.requestFrom(0X88, 1);         // request 1 byte from keyboard
      while (Wire.available()) { 
        key_val = Wire.read();   // receive a byte as character
        key_val ^= 0xff;
    }
  }
  M5.Lcd.setCursor(50, 50);

  sprintf(strBuf, "kay_val : %x cnt : %d\n", key_val, cnt);
  M5.Lcd.print(strBuf);

  if( key_val & KEY_U ) M5.Lcd.print("UP    ");
  if( key_val & KEY_D ) M5.Lcd.print("DOWN  ");
  if( key_val & KEY_L ) M5.Lcd.print("LEFT  ");
  if( key_val & KEY_R ) M5.Lcd.print("RIGHT ");
  if( key_val & KEY_A ) M5.Lcd.print("A ");
  if( key_val & KEY_B ) M5.Lcd.print("B ");
  if( key_val & KEY_SL ) M5.Lcd.print("SL ");
  if( key_val & KEY_ST ) M5.Lcd.print("ST ");
    
    delay(1);

}

M5Stack の液晶ディスプレイ ILI9341 をちょっと解明してみた M5Stack の液晶ディスプレイ ILI9341 をちょっと解明してみた - Nao_uの日記 を含むブックマーク はてなブックマーク - M5Stack の液晶ディスプレイ ILI9341 をちょっと解明してみた - Nao_uの日記 M5Stack の液晶ディスプレイ ILI9341 をちょっと解明してみた - Nao_uの日記 のブックマークコメント


M5StackでGrove超音波距離センサの値を画面表示 M5StackでGrove超音波距離センサの値を画面表示 - Nao_uの日記 を含むブックマーク はてなブックマーク - M5StackでGrove超音波距離センサの値を画面表示 - Nao_uの日記 M5StackでGrove超音波距離センサの値を画面表示 - Nao_uの日記 のブックマークコメント

元のサンプルは9600だったが、Serial.begin(115200) にしないといけないらしい。

#include "Ultrasonic.h"
#include <M5Stack.h>

Ultrasonic ultrasonic(22);

void setup()
{
  M5.begin();
  Serial.begin(115200);

  delay(500);

  M5.Lcd.setTextFont(2);
  M5.Lcd.setCursor(10, 10);


}
void loop()
{
  long RangeInCentimeters;

  Serial.println("The distance to obstacles in front is: ");

  RangeInCentimeters = ultrasonic.MeasureInCentimeters(); // two measurements should keep an interval

  M5.Lcd.clear();

  M5.Lcd.setCursor(10, 10);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setTextSize(2);
  M5.Lcd.printf("Ultrasonic distance\n");

  M5.Lcd.setCursor(50, 50);
  M5.Lcd.setTextColor(YELLOW);
  M5.Lcd.setTextSize(2);
  M5.Lcd.printf("%d cm\n", RangeInCentimeters);
  delay(16);

  Serial.print(RangeInCentimeters);//0~400cm
  Serial.println(" cm");

  M5.update();
}

M5Stackでストップウォッチを作る M5Stackでストップウォッチを作る - Nao_uの日記 を含むブックマーク はてなブックマーク - M5Stackでストップウォッチを作る - Nao_uの日記 M5Stackでストップウォッチを作る - Nao_uの日記 のブックマークコメント

https://qiita.com/zasshyu6/items/c0bd9bb592192b3c80e7

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20200104

2019-12-28

ESP32 (M5StickC) で PS3 の コントローラ を使う ESP32 (M5StickC) で PS3 の コントローラ を使う - Nao_uの日記 を含むブックマーク はてなブックマーク - ESP32 (M5StickC) で PS3 の コントローラ を使う - Nao_uの日記 ESP32 (M5StickC) で PS3 の コントローラ を使う - Nao_uの日記 のブックマークコメント

http://gijin77.blog.jp/archives/21966552.html

屋根裏実験室 M5Stackを使ってみる 屋根裏実験室 M5Stackを使ってみる - Nao_uの日記 を含むブックマーク はてなブックマーク - 屋根裏実験室 M5Stackを使ってみる - Nao_uの日記 屋根裏実験室 M5Stackを使ってみる - Nao_uの日記 のブックマークコメント

http://itoi.jp/M5Stack.html

液晶付きマイコン「M5Stack」 と Google Home で、子どもとメッセージがやりとりできるシステムを作ってみた 液晶付きマイコン「M5Stack」 と Google Home で、子どもとメッセージがやりとりできるシステムを作ってみた - Nao_uの日記 を含むブックマーク はてなブックマーク - 液晶付きマイコン「M5Stack」 と Google Home で、子どもとメッセージがやりとりできるシステムを作ってみた - Nao_uの日記 液晶付きマイコン「M5Stack」 と Google Home で、子どもとメッセージがやりとりできるシステムを作ってみた - Nao_uの日記 のブックマークコメント

https://fabcross.jp/category/make/20180425_kodomo_messenger_01.html


M5cameraでWebカメラを作る M5cameraでWebカメラを作る - Nao_uの日記 を含むブックマーク はてなブックマーク - M5cameraでWebカメラを作る - Nao_uの日記 M5cameraでWebカメラを作る - Nao_uの日記 のブックマークコメント

https://ambidata.io/samples/m5stack/m5camera/


Pan/Tilt 機構作成キット Pan/Tilt 機構作成キット - Nao_uの日記 を含むブックマーク はてなブックマーク - Pan/Tilt 機構作成キット - Nao_uの日記 Pan/Tilt 機構作成キット - Nao_uの日記 のブックマークコメント

https://www.switch-science.com/catalog/3486/

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191228

2019-12-02

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191202

2019-11-23

[]MicroBitでSuperBitの拡張を使うときのURL MicroBitでSuperBitの拡張を使うときのURL - Nao_uの日記 を含むブックマーク はてなブックマーク - MicroBitでSuperBitの拡張を使うときのURL - Nao_uの日記 MicroBitでSuperBitの拡張を使うときのURL - Nao_uの日記 のブックマークコメント

https://github.com/lzty634158/SuperBit

SparkFun moto:bit の I2C 操作と MicroPython からの利用 SparkFun moto:bit の I2C 操作と MicroPython からの利用 - Nao_uの日記 を含むブックマーク はてなブックマーク - SparkFun moto:bit の I2C 操作と MicroPython からの利用 - Nao_uの日記 SparkFun moto:bit の I2C 操作と MicroPython からの利用 - Nao_uの日記 のブックマークコメント

https://qiita.com/inachi/items/6ed7c42dc1faa35ba89c

MOVE miniスマホでリモコン操作する[プログラム編③] MOVE miniスマホでリモコン操作する[プログラム編③] - Nao_uの日記 を含むブックマーク はてなブックマーク - MOVE miniスマホでリモコン操作する[プログラム編③] - Nao_uの日記 MOVE miniスマホでリモコン操作する[プログラム編③] - Nao_uの日記 のブックマークコメント

http://www.umek.topaz.ne.jp/mameduino/move-mini_smartphone-1/

無線操縦で走る!荷台が動く!サイレン音が鳴り響く! 無線操縦で走る!荷台が動く!サイレン音が鳴り響く! - Nao_uの日記 を含むブックマーク はてなブックマーク - 無線操縦で走る!荷台が動く!サイレン音が鳴り響く! - Nao_uの日記 無線操縦で走る!荷台が動く!サイレン音が鳴り響く! - Nao_uの日記 のブックマークコメント

Running:bit【無線操縦編】

https://sanuki-tech.net/micro-bit/kit/remote-control-running-bit/

[]アナログジョイパッド入力 + 無線送受信のテストスクリプト アナログジョイパッド入力 + 無線送受信のテストスクリプト - Nao_uの日記 を含むブックマーク はてなブックマーク - アナログジョイパッド入力 + 無線送受信のテストスクリプト - Nao_uの日記 アナログジョイパッド入力 + 無線送受信のテストスクリプト - Nao_uの日記 のブックマークコメント

送信側

# Add your Python code here. E.g.
from microbit import *
import radio

slist = ["50000","05000","00500","00050","00005"]

def clamp( val, min_, max_):
    return max(min(val,max_), min_)

# LED座標系に変換
def convLEDCoord( x ):
    return int( clamp( ((x+1)/2.0)*5, 0,4) )

def makeImg(x,y):
    ret=""
    for i in range(5):
        if y==i:
            ret += slist[x]
        else:
            ret += "00000"
        if i!=4:
            ret += ":"
    return Image(ret)

radio.on()

while True:
    pin2.write_digital(0)
    x0_raw = pin0.read_analog()
    y0_raw = pin1.read_analog()
    pin2.write_digital(1)
    x1_raw = pin0.read_analog()
    y1_raw = pin1.read_analog()
    x0 = clamp((x0_raw-504)/512, -1, 1)
    y0 = clamp((y0_raw-504)/512, -1, 1)
    x1 = clamp((x1_raw-504)/512, -1, 1)
    y1 = clamp((y1_raw-504)/512, -1, 1)
    
    send_str = "x0:%d y0:%d x1:%d y1:%d" % (x0_raw, y0_raw, x1_raw, y1_raw)
    radio.send(send_str)
    
    x = convLEDCoord(x0)
    y = 4-convLEDCoord(y0)
    im00 = makeImg(x,y);
    display.show(im00)

受信側

# Add your Python code here. E.g.
from microbit import *
import radio

slist = ["50000","05000","00500","00050","00005"]

def clamp( val, min_, max_):
    return max(min(val,max_), min_)

# LED座標系に変換
def convLEDCoord( x ):
    return int( clamp( ((x+1)/2.0)*5, 0,4) )

def makeImg(x,y):
    ret=""
    for i in range(5):
        if y==i:
            ret += slist[x]
        else:
            ret += "00000"
        if i!=4:
            ret += ":"
    return Image(ret)

radio.on()

while True:
    x0_raw = 0
    y0_raw = 0
    msg = str(radio.receive())
    if msg != "None":
        spr = msg.split()
        x0_raw = int(spr[0][3:])
        y0_raw = int(spr[1][3:])
        x1_raw = int(spr[2][3:])
        y1_raw = int(spr[3][3:])

        x0 = clamp((x0_raw-504)/512, -1, 1)
        y0 = clamp((y0_raw-504)/512, -1, 1)
        
        x = convLEDCoord(x0)
        y = 4-convLEDCoord(y0)
        im00 = makeImg(x,y);
        display.show(im00)

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191123

2019-10-30

Octahedral Impostors Octahedral Impostors - Nao_uの日記 を含むブックマーク はてなブックマーク - Octahedral Impostors - Nao_uの日記 Octahedral Impostors - Nao_uの日記 のブックマークコメント

//float3 UVtoOctahedron(float2 uv) 
vector2 uv;
uv.x = @P.x;
uv.y = @P.y;
{
    // Unpack the 0...1 range to the -1...1 unit square.
    vector position = set( (uv.x - 0.5f)*2.0, (uv.y - 0.5f)*2.0,0);                

    // "Lift" the middle of the square to +1 z, and let it fall off linearly
    // to z = 0 along the Manhattan metric diamond (absolute.x + absolute.y == 1),
    // and to z = -1 at the corners where position.x and .y are both = +-1.
    vector2 absolute;
    absolute.x = abs(position.x);
    absolute.y = abs(position.y);
    
    position.z = 1.0f - absolute.x - absolute.y;

    // "Tuck in" the corners by reflecting the xy position along the line y = 1 - x
    // (in quadrant 1), and its mirrored image in the other quadrants.
    if(position.z < 0) {
        vector2 f2 = set(1.0f - absolute.y, 1.0f - absolute.x);
        position.x = sign(position.x) * f2.x;
        position.y = sign(position.y) * f2.y;
    }

    @P.x = position.x;
    @P.y = position.y;
    @P.z = position.z;
    v@absolute = absolute;
}
float2 VectortoOctahedron( float3 N )
{
	N /= dot( 1.0, abs(N) );
	if( N.z <= 0 )
	{
		N.xy = ( 1 - abs(N.yx) ) * ( N.xy >= 0 ? 1.0 : -1.0 );
	}
	return N.xy;
}

float2 VectortoHemiOctahedron( float3 N )
{
	N.xy /= dot( 1.0, abs(N) );
	return float2( N.x + N.y, N.x - N.y );
}

float3 OctahedronToVector( float2 Oct )
{
	float3 N = float3( Oct, 1.0 - dot( 1.0, abs(Oct) ) );
	if( N.z < 0 )
	{
		N.xy = ( 1 - abs(N.yx) ) * ( N.xy >= 0 ? 1.0 : -1.0 );
	}
	return normalize(N);
}

float3 HemiOctahedronToVector( float2 Oct )
{
	Oct = float2( Oct.x + Oct.y, Oct.x - Oct.y ) *0.5;
	float3 N = float3( Oct, 1 - dot( 1.0, abs(Oct) ) );
	return normalize(N);
}

inline void OctaImpostorVertex( inout float4 vertex, inout float3 normal, inout float4 uvsFrame1, inout float4 uvsFrame2, inout float4 uvsFrame3, inout float4 octaFrame, inout float4 viewPos )
{
	// Inputs
	float2 uvOffset = _AI_SizeOffset.zw;
	float parallax = -_Parallax; // check sign later
	float UVscale = _ImpostorSize;
	float framesXY = _Frames;
	float prevFrame = framesXY - 1;
	float3 fractions = 1.0 / float3( framesXY, prevFrame, UVscale );
	float fractionsFrame = fractions.x;
	float fractionsPrevFrame = fractions.y;
	float fractionsUVscale = fractions.z;

	// Basic data
	float3 worldOrigin = 0;
	float4 perspective = float4( 0, 0, 0, 1 );
	// if there is no perspective we offset world origin with a 5000 view dir vector, otherwise we use the original world position
	if( UNITY_MATRIX_P[ 3 ][ 3 ] == 1 ) 
	{
		perspective = float4( 0, 0, 5000, 0 );
		worldOrigin = ai_ObjectToWorld._m03_m13_m23;
	}
	float3 worldCameraPos = worldOrigin + mul( UNITY_MATRIX_I_V, perspective ).xyz;

	float3 objectCameraPosition = mul( ai_WorldToObject, float4( worldCameraPos, 1 ) ).xyz - _Offset.xyz; //ray origin
	float3 objectCameraDirection = normalize( objectCameraPosition );

	// Create orthogonal vectors to define the billboard
	float3 upVector = float3( 0,1,0 );
	float3 objectHorizontalVector = normalize( cross( objectCameraDirection, upVector ) );
	float3 objectVerticalVector = cross( objectHorizontalVector, objectCameraDirection );

	// Billboard
	float2 uvExpansion = vertex.xy;
	float3 billboard = objectHorizontalVector * uvExpansion.x + objectVerticalVector * uvExpansion.y;

	float3 localDir = billboard - objectCameraPosition; // ray direction

	// Octahedron Frame
	#ifdef _HEMI_ON
		objectCameraDirection.y = max(0.001, objectCameraDirection.y);
		float2 frameOcta = VectortoHemiOctahedron( objectCameraDirection.xzy ) * 0.5 + 0.5;
	#else
		float2 frameOcta = VectortoOctahedron( objectCameraDirection.xzy ) * 0.5 + 0.5;
	#endif

	// Setup for octahedron
	float2 prevOctaFrame = frameOcta * prevFrame;
	float2 baseOctaFrame = floor( prevOctaFrame );
	float2 fractionOctaFrame = ( baseOctaFrame * fractionsFrame );

	// Octa 1
	float2 octaFrame1 = ( baseOctaFrame * fractionsPrevFrame ) * 2.0 - 1.0;
	#ifdef _HEMI_ON
		float3 octa1WorldY = HemiOctahedronToVector( octaFrame1 ).xzy;
	#else
		float3 octa1WorldY = OctahedronToVector( octaFrame1 ).xzy;
	#endif

	float3 octa1LocalY;
	float2 uvFrame1;
	RayPlaneIntersectionUV( octa1WorldY, objectCameraPosition, localDir, /*inout*/ uvFrame1, /*inout*/ octa1LocalY );

	float2 uvParallax1 = octa1LocalY.xy * fractionsFrame * parallax;
	uvFrame1 = ( uvFrame1 * fractionsUVscale + 0.5 ) * fractionsFrame + fractionOctaFrame;
	uvsFrame1 = float4( uvParallax1, uvFrame1) - float4( 0, 0, uvOffset );

	// Octa 2
	float2 fractPrevOctaFrame = frac( prevOctaFrame );
	float2 cornerDifference = lerp( float2( 0,1 ) , float2( 1,0 ) , saturate( ceil( ( fractPrevOctaFrame.x - fractPrevOctaFrame.y ) ) ));
	float2 octaFrame2 = ( ( baseOctaFrame + cornerDifference ) * fractionsPrevFrame ) * 2.0 - 1.0;
	#ifdef _HEMI_ON
		float3 octa2WorldY = HemiOctahedronToVector( octaFrame2 ).xzy;
	#else
		float3 octa2WorldY = OctahedronToVector( octaFrame2 ).xzy;
	#endif

	float3 octa2LocalY;
	float2 uvFrame2;
	RayPlaneIntersectionUV( octa2WorldY, objectCameraPosition, localDir, /*inout*/ uvFrame2, /*inout*/ octa2LocalY );

	float2 uvParallax2 = octa2LocalY.xy * fractionsFrame * parallax;
	uvFrame2 = ( uvFrame2 * fractionsUVscale + 0.5 ) * fractionsFrame + ( ( cornerDifference * fractionsFrame ) + fractionOctaFrame );
	uvsFrame2 = float4( uvParallax2, uvFrame2) - float4( 0, 0, uvOffset );

	// Octa 3
	float2 octaFrame3 = ( ( baseOctaFrame + 1 ) * fractionsPrevFrame  ) * 2.0 - 1.0;
	#ifdef _HEMI_ON
		float3 octa3WorldY = HemiOctahedronToVector( octaFrame3 ).xzy;
	#else
		float3 octa3WorldY = OctahedronToVector( octaFrame3 ).xzy;
	#endif

	float3 octa3LocalY;
	float2 uvFrame3;
	RayPlaneIntersectionUV( octa3WorldY, objectCameraPosition, localDir, /*inout*/ uvFrame3, /*inout*/ octa3LocalY );

	float2 uvParallax3 = octa3LocalY.xy * fractionsFrame * parallax;
	uvFrame3 = ( uvFrame3 * fractionsUVscale + 0.5 ) * fractionsFrame + ( fractionOctaFrame + fractionsFrame );
	uvsFrame3 = float4( uvParallax3, uvFrame3) - float4( 0, 0, uvOffset );

	// maybe remove this?
	octaFrame = 0;
	octaFrame.xy = prevOctaFrame;
	#if AI_CLIP_NEIGHBOURS_FRAMES
		octaFrame.zw = fractionOctaFrame;
	#endif

	vertex.xyz = billboard + _Offset.xyz;
	normal.xyz = objectCameraDirection;

	// view pos
	viewPos = 0;
	#ifdef AI_RENDERPIPELINE
		viewPos.xyz = TransformWorldToView( TransformObjectToWorld( vertex.xyz ) );
	#else
		viewPos.xyz = UnityObjectToViewPos( vertex.xyz );
	#endif

	#ifdef EFFECT_HUE_VARIATION
		float hueVariationAmount = frac( ai_ObjectToWorld[0].w + ai_ObjectToWorld[1].w + ai_ObjectToWorld[2].w);
		viewPos.w = saturate(hueVariationAmount * _HueVariation.a);
	#endif
}

inline void OctaImpostorFragment( inout SurfaceOutputStandardSpecular o, out float4 clipPos, out float3 worldPos, float4 uvsFrame1, float4 uvsFrame2, float4 uvsFrame3, float4 octaFrame, float4 interpViewPos )
{
	float depthBias = -1.0;
	float textureBias = _TextureBias;

	// Octa1
	float4 parallaxSample1 = tex2Dbias( _Normals, float4( uvsFrame1.zw, 0, depthBias) );
	float2 parallax1 = ( ( 0.5 - parallaxSample1.a ) * uvsFrame1.xy ) + uvsFrame1.zw;
	float4 albedo1 = tex2Dbias( _Albedo, float4( parallax1, 0, textureBias) );
	float4 normals1 = tex2Dbias( _Normals, float4( parallax1, 0, textureBias) );
	float4 mask1 = tex2Dbias( _Emission, float4( parallax1, 0, textureBias) );
	float4 spec1 = tex2Dbias( _Specular, float4( parallax1, 0, textureBias) );

	// Octa2
	float4 parallaxSample2 = tex2Dbias( _Normals, float4( uvsFrame2.zw, 0, depthBias) );
	float2 parallax2 = ( ( 0.5 - parallaxSample2.a ) * uvsFrame2.xy ) + uvsFrame2.zw;
	float4 albedo2 = tex2Dbias( _Albedo, float4( parallax2, 0, textureBias) );
	float4 normals2 = tex2Dbias( _Normals, float4( parallax2, 0, textureBias) );
	float4 mask2 = tex2Dbias( _Emission, float4( parallax2, 0, textureBias) );
	float4 spec2 = tex2Dbias( _Specular, float4( parallax2, 0, textureBias) );

	// Octa3
	float4 parallaxSample3 = tex2Dbias( _Normals, float4( uvsFrame3.zw, 0, depthBias) );
	float2 parallax3 = ( ( 0.5 - parallaxSample3.a ) * uvsFrame3.xy ) + uvsFrame3.zw;
	float4 albedo3 = tex2Dbias( _Albedo, float4( parallax3, 0, textureBias) );
	float4 normals3 = tex2Dbias( _Normals, float4( parallax3, 0, textureBias) );
	float4 mask3 = tex2Dbias( _Emission, float4( parallax3, 0, textureBias) );
	float4 spec3 = tex2Dbias( _Specular, float4( parallax3, 0, textureBias) );

	// Weights
	float2 fraction = frac( octaFrame.xy );
	float2 invFraction = 1 - fraction;
	float3 weights;
	weights.x = min( invFraction.x, invFraction.y );
	weights.y = abs( fraction.x - fraction.y );
	weights.z = min( fraction.x, fraction.y );

	// Blends
	float4 blendedAlbedo = albedo1 * weights.x + albedo2 * weights.y + albedo3 * weights.z;
	float4 blendedNormal = normals1 * weights.x  + normals2 * weights.y + normals3 * weights.z;
	float4 blendedMask = mask1 * weights.x  + mask2 * weights.y + mask3 * weights.z;
	float4 blendedSpec = spec1 * weights.x  + spec2 * weights.y + spec3 * weights.z;

	float3 localNormal = blendedNormal.rgb * 2.0 - 1.0;
	float3 worldNormal = normalize( mul( (float3x3)ai_ObjectToWorld, localNormal ) );

	float3 viewPos = interpViewPos.xyz;
	float depthOffset = ( ( parallaxSample1.a * weights.x + parallaxSample2.a * weights.y + parallaxSample3.a * weights.z ) - 0.5 /** 2.0 - 1.0*/ ) /** 0.5*/ * _DepthSize * length( ai_ObjectToWorld[ 2 ].xyz );
	
	#if !defined(AI_RENDERPIPELINE) // no SRP
		#if defined(SHADOWS_DEPTH)
			if( unity_LightShadowBias.y == 1.0 ) // get only the shadowcaster, this is a hack
			{
				viewPos.z += depthOffset * _AI_ShadowView;
				viewPos.z += -_AI_ShadowBias;
			}
			else // else add offset normally
			{
				viewPos.z += depthOffset;
			}
		#else // else add offset normally
			viewPos.z += depthOffset;
		#endif
	#elif defined(AI_RENDERPIPELINE) // SRP
		#if ( defined(SHADERPASS) && (SHADERPASS == SHADERPASS_SHADOWS) ) || defined(UNITY_PASS_SHADOWCASTER)
			viewPos.z += depthOffset * _AI_ShadowView;
			viewPos.z += -_AI_ShadowBias;
		#else // else add offset normally
			viewPos.z += depthOffset;
		#endif
	#endif

	worldPos = mul( UNITY_MATRIX_I_V, float4( viewPos.xyz, 1 ) ).xyz;
	clipPos = mul( UNITY_MATRIX_P, float4( viewPos, 1 ) );
	
	#if !defined(AI_RENDERPIPELINE) // no SRP
		#if defined(SHADOWS_DEPTH)
			clipPos = UnityApplyLinearShadowBias( clipPos );
		#endif
	#elif defined(AI_RENDERPIPELINE) // SRP
		#if defined(UNITY_PASS_SHADOWCASTER) && !defined(SHADERPASS)
			#if UNITY_REVERSED_Z
				clipPos.z = min( clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE );
			#else
				clipPos.z = max( clipPos.z, clipPos.w * UNITY_NEAR_CLIP_VALUE );
			#endif
		#endif
	#endif
	
	clipPos.xyz /= clipPos.w;
	
	if( UNITY_NEAR_CLIP_VALUE < 0 )
		clipPos = clipPos * 0.5 + 0.5;

	#ifdef EFFECT_HUE_VARIATION
		half3 shiftedColor = lerp(blendedAlbedo.rgb, _HueVariation.rgb, interpViewPos.w);
		half maxBase = max(blendedAlbedo.r, max(blendedAlbedo.g, blendedAlbedo.b));
		half newMaxBase = max(shiftedColor.r, max(shiftedColor.g, shiftedColor.b));
		maxBase /= newMaxBase;
		maxBase = maxBase * 0.5f + 0.5f;
		shiftedColor.rgb *= maxBase;
		blendedAlbedo.rgb = saturate(shiftedColor);
	#endif
	
	#if AI_CLIP_NEIGHBOURS_FRAMES
		float t = ceil( fraction.x - fraction.y );
		float4 cornerDifference = float4( t, 1 - t, 1, 1 );

		float2 step_1 = ( parallax1 - octaFrame.zw ) * _Frames;
		float4 step23 = ( float4( parallax2, parallax3 ) -  octaFrame.zwzw ) * _Frames - cornerDifference;

		step_1 = step_1 * (1-step_1);
		step23 = step23 * (1-step23);

		float3 steps;
		steps.x = step_1.x * step_1.y;
		steps.y = step23.x * step23.y;
		steps.z = step23.z * step23.w;
		steps = step(-steps, 0);
	
		float final = dot( steps, weights );

		clip( final - 0.5 );
	#endif
		
	o.Albedo = blendedAlbedo.rgb;
	o.Normal = worldNormal;
	o.Emission = blendedMask.rgb;
	o.Specular = blendedSpec.rgb;
	o.Smoothness = blendedSpec.a;
	o.Occlusion = blendedMask.a;
	o.Alpha = ( blendedAlbedo.a - _ClipMask );
	clip( o.Alpha );
}

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191030

2019-10-22

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191022

2019-10-20

[]OBBの一番長い軸を取得する方法 OBBの一番長い軸を取得する方法 - Nao_uの日記 を含むブックマーク はてなブックマーク - OBBの一番長い軸を取得する方法 - Nao_uの日記 OBBの一番長い軸を取得する方法 - Nao_uの日記 のブックマークコメント

https://www.sidefx.com/forum/topic/31983/?page=1#post-149134

  • boundノードで0BBが作れる
  • バンディングボックスのxyz軸のなかで一番長いものを残す

f:id:Nao_u:20191020205653p:image

長軸で分割するには、下記wrangleで長軸を取り出してresamleしてvoronoi

vector p0 = point(1,"P",0);

vector p1 = point(1,"P",1);

vector p2 = point(1,"P",2);

vector p3 = point(1,"P",3);

vector np0,np1;

if( length(p0-p1) > length(p1-p2)){

np0 = (p0+p3)*0.5;

np1 = (p1+p2)*0.5;

}else{

np0 = (p0+p1)*0.5;

np1 = (p2+p3)*0.5;

}

addpoint(0,np0);

addpoint(0,np1);

int prim = addprim(geoself(), "polyline");

addvertex(geoself(), prim, 0);

addvertex(geoself(), prim, 1);


[] 直線を分割している不要なエッジの削除  直線を分割している不要なエッジの削除 - Nao_uの日記 を含むブックマーク はてなブックマーク -  直線を分割している不要なエッジの削除 - Nao_uの日記  直線を分割している不要なエッジの削除 - Nao_uの日記 のブックマークコメント

https://gamecgben.blogspot.com/2018/02/houdini.html

FacetのRemove Inline Points、distanceで調整

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191020

2019-10-13

Noise Lab (3D) Noise Lab (3D)  - Nao_uの日記 を含むブックマーク はてなブックマーク - Noise Lab (3D)  - Nao_uの日記 Noise Lab (3D)  - Nao_uの日記 のブックマークコメント

// Grab from https://www.shadertoy.com/view/4djSRW

#define MOD3 vec3(.1031,.11369,.13787)

//#define MOD3 vec3(443.8975,397.2973, 491.1871)

float hash31(vec3 p3)

{

p3 = fract(p3 * MOD3);

p3 += dot(p3, p3.yzx + 19.19);

return -1.0 + 2.0 * fract((p3.x + p3.y) * p3.z);

}

こんなシンプルなコードで3Dのノイズが返せてる

x = fract((p3.x + p3.y) * p3.z;

y = fract((p3.y + p3.z) * p3.x;

z = fract((p3.z + p3.x) * p3.y;

にしたら3次元化できる

トラックバック - http://game.g.hatena.ne.jp/Nao_u/20191013