27.09.2020, 10:01
(Dieser Beitrag wurde zuletzt bearbeitet: 27.09.2020, 10:55 von AstroCuber.)
Mal ein Update meinerseits: Ich habe nun, da ich es doch für den leichtesten Weg hielt, einfach Deine Methode übernommen: Die 54byte RAM sind für einen modernen Microcontroller einfach nur lachhaft. Der Mikrocontroller ESP32, den ich dazu einsetze, hat laut wikipedia 160kiB RAM. Mein Board (wemos lolin32) hat zudem 4MB Flashspeicher und 240MHz-Taktung. Das ist doch ein Vorteil moderner Zeiten: Die sparsame Programmierung aus den 90ern mit PIC16 sollte ich mir dringend abgewöhnen. Dank Wifi und Webserver-Steuerung kann man auch vollkommen auf Hardware-Bedienung verzichten und alles bequem per Smartphone steuern.
Die Moves habe ich mit Hilfe einer mathematischen Abbildung allerdings nicht einfach hinbekommen, weshalb ich sie erst mal einfach als Zeichenketten Umsortierungen umgesetzt habe. Bsp:
Ich habe mir einen (starren, nicht drehbaren) Cube mit 54 RGBW-Leds aufgebebaut, der darüber gesteuert wird.
Von Solve-Funktionen bin ich allerdings noch weit weg. Dafür muss ich die Grundstruktur vermutlich noch mal komplett überarbeiten.
Demo-Modus (zufällige Moves) / Scambeln oder manuelle Einzel-Moves über Web-Steuerung gehen aber schon.
Die Moves habe ich mit Hilfe einer mathematischen Abbildung allerdings nicht einfach hinbekommen, weshalb ich sie erst mal einfach als Zeichenketten Umsortierungen umgesetzt habe. Bsp:
Code:
// cube format: down left back right front up
char cube[] = "wwwwwwwwwrrrrrrrrrbbbbbbbbbooooooooogggggggggyyyyyyyyy";
// 012345678901234567890123456789012345678901234567890123
// 0 1 2 3 4 5
void half_R(){
char memo;
//first step: rotate right face
memo=cube[27];
cube[27]=cube[30];
cube[30]=cube[33];
cube[33]=cube[34];
cube[34]=cube[35];
cube[35]=cube[32];
cube[32]=cube[29];
cube[29]=cube[28];
cube[28]=memo;
}
//wwwwwwwwwrrrrrrrrrbbbbbbbbbooooooooogggggggggyyyyyyyyy
//012345678901234567890123456789012345678901234567890123
//0 1 2 3 4 5
void third_R(){
char memo;
// second step: rotate right column
memo=cube[38];
cube[38]=cube[41];
cube[41]=cube[44];
cube[44]=cube[2];
cube[2]=cube[5];
cube[5]=cube[8];
cube[8]=cube[24];
cube[24]=cube[21];
cube[21]=cube[18];
cube[18]=cube[47];
cube[47]=cube[50];
cube[50]=cube[53];
cube[53]=memo;
}
//wwwwwwwwwrrrrrrrrrbbbbbbbbbooooooooogggggggggyyyyyyyyy
//012345678901234567890123456789012345678901234567890123
//0
..
..
..
void(*mvptr[])(void) = {
half_R, third_R,
..
..
..
}
void animv(int motion)
{
int slot=anitime/6;
(*mvptr[motion])(); // half motion face
(*mvptr[motion+1])(); // third motion row
displaycube();
delay(slot);
delay(slot);
(*mvptr[motion+1])(); // third motion row
displaycube();
delay(slot);
delay(slot);
(*mvptr[motion+1])(); // third motion row
(*mvptr[motion])(); // half motion face
displaycube();
delay(slot);
delay(slot);
}
#define R 0
animv(R);
Ich habe mir einen (starren, nicht drehbaren) Cube mit 54 RGBW-Leds aufgebebaut, der darüber gesteuert wird.
Von Solve-Funktionen bin ich allerdings noch weit weg. Dafür muss ich die Grundstruktur vermutlich noch mal komplett überarbeiten.
Demo-Modus (zufällige Moves) / Scambeln oder manuelle Einzel-Moves über Web-Steuerung gehen aber schon.