#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); } }}