#author("2020-06-03T22:08:49+09:00","default:TeleportDresser","TeleportDresser")
[[TeleportDresser]]
- [[このページ:https://ore-kb.net/archives/195]]のライブラリ, ST7032, をダウンロードして、解凍して、re-name して、事前に arduino の libraries に入れておくことが必要になります。
#author("2020-06-03T22:10:37+09:00","default:TeleportDresser","TeleportDresser")
#code(Python){{

#code(C){{
// Adafruit_NeoMatrix example for single NeoPixel Shield.
// Scrolls 'Howdy' across the matrix in a portrait (vertical) orientation.
# coding: utf-8
from PIL import Image
import smbus
import time
import sys
import requests

#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <Adafruit_NeoPixel.h>
#ifndef PSTR
 #define PSTR // Make Arduino Due happy
#endif
off_x=0
off_y=0

#include <Wire.h>
#define SLAVE_ADDRESS 0x30
int status = 0;
imax=75
jmax=16

#define PIN 6
anime_dir="/home/pi/Pictures/"
anime_pics_name=["anime-ex1_01.png","anime-ex1_02.png",
            "anime-ex1_03.png","anime-ex1_04.png","anime-ex1_05.png"]
anime_img=["","","","",""]

// MATRIX DECLARATION:
// Parameter 1 = width of NeoPixel matrix
// Parameter 2 = height of matrix
// Parameter 3 = pin number (most are valid)
// Parameter 4 = matrix layout flags, add together as needed:
//   NEO_MATRIX_TOP, NEO_MATRIX_BOTTOM, NEO_MATRIX_LEFT, NEO_MATRIX_RIGHT:
//     Position of the FIRST LED in the matrix; pick two, e.g.
//     NEO_MATRIX_TOP + NEO_MATRIX_LEFT for the top-left corner.
//   NEO_MATRIX_ROWS, NEO_MATRIX_COLUMNS: LEDs are arranged in horizontal
//     rows or in vertical columns, respectively; pick one or the other.
//   NEO_MATRIX_PROGRESSIVE, NEO_MATRIX_ZIGZAG: all rows/columns proceed
//     in the same order, or alternate lines reverse direction; pick one.
//   See example below for these values in action.
// Parameter 5 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_GRBW    Pixels are wired for GRBW bitstream (RGB+W NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
#print( 'number of arguments:', len(sys.argv), 'arguments.')
#arglist = sys.argv
#print( 'Argument List:', sys.argv)
#file_name=arglist[1]
#print( 'file_name=', file_name)
i2c = smbus.SMBus(1) # 注:ラズパイのI2Cポート

def main():
    for i in range(5):
        pic_name = anime_dir+anime_pics_name[i]
        anime_img[i] = Image.open(pic_name)
        #img = Image.open(file_name)
    for j in range(20):
        for i in range(5):
            show_one_pic(anime_img[i])
            #time.sleep(0.1)
              
#
# command:
#   clear... 0x00
#   show ... 0x01
#   set1 ix,iy,r,g,b
#         ... 0x02  *,*,  *,*,*
#   setn ix,iy,n, r0,g0,b0, ..r(n-1),g(n-1),b(n-1)   n<=8
#         ... 0x03 *,*, *, *,*,*, ..., *,*,*
#
pixels=[[(0,0,0) for j in range(jmax)] for i in range(imax)]
addrs = [0x30,0x31,0x32,0x33]
fourpix=[0x00, 0x00, 0x04, 0,0,0, 0,0,0, 0,0,0, 0,0,0]
          
def show_one_pic(img):
  img_width, img_height = img.size
  print('width:',img_width)
  print('height:',img_height)

// Example for NeoPixel Shield.  In this application we'd like to use it
// as a 5x8 tall matrix, with the USB port positioned at the top of the
// Arduino.  When held that way, the first pixel is at the top right, and
// lines are arranged in columns, progressive order.  The shield uses
// 800 KHz (v2) pixels that expect GRB color data.
Adafruit_NeoMatrix matrix = Adafruit_NeoMatrix(4, 75, PIN,
  NEO_MATRIX_TOP     + NEO_MATRIX_LEFT +
  NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG,
  NEO_GRB            + NEO_KHZ800);
  dx=img_width/jmax
  dy=img_height/imax

const int b0 = 2;     // the number of the pushbutton pin
const int b1 = 3;
  for i in range(imax):
    for j in range(jmax):
        x=off_x+j*dx
        y=off_y+i*dy
        rgb=img.getpixel((x,y))
        pixels[i][j]=rgb

const uint16_t colors[] = {
  matrix.Color(255, 0, 0), matrix.Color(0, 255, 0), matrix.Color(0, 0, 255) };
  i2c.write_byte(addrs[0],0x00)
  i2c.write_byte(addrs[1],0x00)
  i2c.write_byte(addrs[2],0x00)
  i2c.write_byte(addrs[3],0x00)
  for i in range(imax):
    for j in range(4):
      for k in range(4):
        p=pixels[i][4*j+k]
        fourpix[3+k*3+0]=p[0]
        fourpix[3+k*3+1]=p[1]
        fourpix[3+k*3+2]=p[2]
      fourpix[0]=i;
      fourpix[1]=0;
      i2c_addr=addrs[j]
      try:
        i2c.write_i2c_block_data(i2c_addr,0x03,fourpix)
      except:
        print('i2c write error at:(',i,',',j,')')
    #time.sleep(0.00001)
  i2c.write_byte(addrs[0],0x01)
  i2c.write_byte(addrs[1],0x01)
  i2c.write_byte(addrs[2],0x01)
  i2c.write_byte(addrs[3],0x01)

void setup() {
  matrix.begin();
//  matrix.setTextWrap(false);
  matrix.setBrightness(40);
//  matrix.setTextColor(colors[0]);
main() 

  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  digitalWrite(4, LOW); // set the LED off
  digitalWrite(5, LOW); // set the LED off

  pinMode(b0, INPUT_PULLUP);
  pinMode(b1, INPUT_PULLUP);
  int b0State = digitalRead(b0);
  int b1State = digitalRead(b1);
  int x=b1State*2+b0State;

   Serial.begin(115200);
  
  // initialize i2c as slave
  Wire.begin(SLAVE_ADDRESS+x);
  Wire.setClock(400000); //400Khz i2c clock

  // define callbacks for i2c communication
  Wire.onReceive(receiveEvent);
  Wire.onRequest(requestEvent);
}

int x    = matrix.width();
int pass = 0;

void loop() {
  delay(10);
}

char cmd[32];

// call back for receive data
void receiveEvent(int byteCount){

// command:
//   clear... 0x00
//   show ... 0x01
//   set1 ix,iy,r,g,b
//         ... 0x02  *,*,  *,*,*
//   setn ix,iy,n, r0,g0,b0, ..r(n-1),g(n-1),b(n-1)   n<=8
//         ... 0x03 *,*, *, *,*,*, ..., *,*,*
  int i=0;
  while(Wire.available()) {
    cmd[i] = Wire.read();
    i++;
  }
  int n=i;
  /*
  for(i=0;i<n;i++){
    Serial.print(" "); Serial.print(cmd[i],HEX);
  }
  Serial.println(" ");
  */
  if(cmd[0]==0x00){
    matrix.fillScreen(0);
  } 
  else
  if(cmd[0]==0x01){
    matrix.show();
    delay(5);
  }
  else
  if(cmd[0]==0x02){ //set1
  //   set1 ix,iy,r,g,b
  //         ... 0x02  *,*,  *,*,*
     int ix=cmd[1];
     int iy=cmd[2];
     int r=cmd[3];
     int g=cmd[4];
     int b=cmd[5];
     int16_t c=matrix.Color(r,g,b);
     matrix.drawPixel(iy,ix,c);
  }
  else
  if(cmd[0]==0x03){
     int ix=cmd[1];
     int iy=cmd[2];
     int n=cmd[3];
     int rn[n];
     int gn[n];
     int bn[n];
     for(int i=0;i<n;i++){
        rn[i]=cmd[i*3+4];
        gn[i]=cmd[i*3+5];
        bn[i]=cmd[i*3+6];
     }
     for(int i=0;i<n;i++){
        int iyp=i%4;
        int ixp=i/4;
        int16_t c=matrix.Color(rn[i],gn[i],bn[i]);
        matrix.drawPixel(iy+iyp,ix+ixp,c);
     }
  }
}


void requestEvent(){
  Wire.write(status);
}
}}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS