Devices & Components
Arduino Uno Rev3
5v 10A switching power supply
Male/Female Jumper Wires
Connector Adapter, DC Power - 2.1mm
Raspberry Pi 4 Model B
SG90 Micro-servo motor
PCA9685
Hardware & Tools
Laser cutter (generic)
Soldering iron (generic)
Software & Tools
Unity
Processing
Arduino IDE
Autodesk - Inventor
Project description
Code
Display Shape - Sine
arduino
We use this simple code to test whether the pin matrix works out, which would show a dynamic sine wave.
1#include <Wire.h> 2#include <Adafruit_PWMServoDriver.h> 3#include <Math.h> 4 5// Address 6Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); 7Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41); 8Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x42); 9Adafruit_PWMServoDriver pwm3 = Adafruit_PWMServoDriver(0x43); 10Adafruit_PWMServoDriver pwm4 = Adafruit_PWMServoDriver(0x44); 11Adafruit_PWMServoDriver pwm5 = Adafruit_PWMServoDriver(0x45); 12Adafruit_PWMServoDriver pwm6 = Adafruit_PWMServoDriver(0x46); 13Adafruit_PWMServoDriver pwm7 = Adafruit_PWMServoDriver(0x47); 14Adafruit_PWMServoDriver pwm8 = Adafruit_PWMServoDriver(0x48); 15Adafruit_PWMServoDriver pwm9 = Adafruit_PWMServoDriver(0x49); 16 17#define SERVOMIN 110 // this is the 'minimum' pulse length count (out of 4096) 18#define SERVOMAX 400 // this is the 'maximum' pulse length count (out of 4096) 19int t = 0; 20int offset = (SERVOMAX + SERVOMIN) / 2; 21int ampl = (SERVOMAX - SERVOMIN) / 2; 22int freq = 1; 23 24void setup() { 25 Serial.begin(115200); 26 Serial.setTimeout(10); 27 Serial.println("16 channel Servo test!"); 28 29 pwm.begin(); 30 pwm1.begin(); 31 pwm2.begin(); 32 pwm3.begin(); 33 pwm4.begin(); 34 pwm5.begin(); 35 pwm6.begin(); 36 pwm7.begin(); 37 pwm8.begin(); 38 pwm9.begin(); 39// Analog servos run at ~60 Hz updates 40 pwm.setPWMFreq(60); 41 pwm1.setPWMFreq(60); 42 pwm2.setPWMFreq(60); 43 pwm3.setPWMFreq(60); 44 pwm4.setPWMFreq(60); 45 pwm5.setPWMFreq(60); 46 pwm6.setPWMFreq(60); 47 pwm7.setPWMFreq(60); 48 pwm8.setPWMFreq(60); 49 pwm9.setPWMFreq(60); 50 51//Zero 52 for(int i = 0; i < 16; i += 1){ 53 pwm.setPWM(i, 0, SERVOMIN); 54 pwm1.setPWM(i, 0, SERVOMIN); 55 pwm2.setPWM(i, 0, SERVOMIN); 56 pwm3.setPWM(i, 0, SERVOMIN); 57 pwm4.setPWM(i, 0, SERVOMIN); 58 pwm5.setPWM(i, 0, SERVOMIN); 59 pwm6.setPWM(i, 0, SERVOMIN); 60 pwm7.setPWM(i, 0, SERVOMIN); 61 pwm8.setPWM(i, 0, SERVOMIN); 62 pwm9.setPWM(i, 0, SERVOMIN); 63 } 64 Serial.println("Ready"); 65} 66 67void loop() { 68 while(Serial.available()){ //To control the starting time. 69 for (int i = 0; i < 10; ++i) 70 { 71 Serial.print((int)(offset+ampl*sin(freq*(i+t)))); 72 Serial.print(" "); 73 pwm.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t)))); 74 pwm1.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+1)))); 75 pwm2.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+2)))); 76 pwm3.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+3)))); 77 pwm4.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+4)))); 78 pwm5.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+5)))); 79 pwm6.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+6)))); 80 pwm7.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+7)))); 81 pwm8.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+8)))); 82 pwm9.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+9)))); 83 } 84 Serial.println(""); 85 delay(100); 86 t++; 87 } 88} 89
Display Shape - Sine
arduino
We use this simple code to test whether the pin matrix works out, which would show a dynamic sine wave.
1#include <Wire.h> 2#include <Adafruit_PWMServoDriver.h> 3#include 4 <Math.h> 5 6// Address 7Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); 8Adafruit_PWMServoDriver 9 pwm1 = Adafruit_PWMServoDriver(0x41); 10Adafruit_PWMServoDriver pwm2 = Adafruit_PWMServoDriver(0x42); 11Adafruit_PWMServoDriver 12 pwm3 = Adafruit_PWMServoDriver(0x43); 13Adafruit_PWMServoDriver pwm4 = Adafruit_PWMServoDriver(0x44); 14Adafruit_PWMServoDriver 15 pwm5 = Adafruit_PWMServoDriver(0x45); 16Adafruit_PWMServoDriver pwm6 = Adafruit_PWMServoDriver(0x46); 17Adafruit_PWMServoDriver 18 pwm7 = Adafruit_PWMServoDriver(0x47); 19Adafruit_PWMServoDriver pwm8 = Adafruit_PWMServoDriver(0x48); 20Adafruit_PWMServoDriver 21 pwm9 = Adafruit_PWMServoDriver(0x49); 22 23#define SERVOMIN 110 // this is the 24 'minimum' pulse length count (out of 4096) 25#define SERVOMAX 400 // this is the 26 'maximum' pulse length count (out of 4096) 27int t = 0; 28int offset = (SERVOMAX 29 + SERVOMIN) / 2; 30int ampl = (SERVOMAX - SERVOMIN) / 2; 31int freq = 1; 32 33void 34 setup() { 35 Serial.begin(115200); 36 Serial.setTimeout(10); 37 Serial.println("16 38 channel Servo test!"); 39 40 pwm.begin(); 41 pwm1.begin(); 42 pwm2.begin(); 43 44 pwm3.begin(); 45 pwm4.begin(); 46 pwm5.begin(); 47 pwm6.begin(); 48 pwm7.begin(); 49 50 pwm8.begin(); 51 pwm9.begin(); 52// Analog servos run at ~60 Hz updates 53 54 pwm.setPWMFreq(60); 55 pwm1.setPWMFreq(60); 56 pwm2.setPWMFreq(60); 57 pwm3.setPWMFreq(60); 58 59 pwm4.setPWMFreq(60); 60 pwm5.setPWMFreq(60); 61 pwm6.setPWMFreq(60); 62 pwm7.setPWMFreq(60); 63 64 pwm8.setPWMFreq(60); 65 pwm9.setPWMFreq(60); 66 67//Zero 68 for(int i = 69 0; i < 16; i += 1){ 70 pwm.setPWM(i, 0, SERVOMIN); 71 pwm1.setPWM(i, 0, 72 SERVOMIN); 73 pwm2.setPWM(i, 0, SERVOMIN); 74 pwm3.setPWM(i, 0, SERVOMIN); 75 76 pwm4.setPWM(i, 0, SERVOMIN); 77 pwm5.setPWM(i, 0, SERVOMIN); 78 pwm6.setPWM(i, 79 0, SERVOMIN); 80 pwm7.setPWM(i, 0, SERVOMIN); 81 pwm8.setPWM(i, 0, SERVOMIN); 82 83 pwm9.setPWM(i, 0, SERVOMIN); 84 } 85 Serial.println("Ready"); 86} 87 88void 89 loop() { 90 while(Serial.available()){ //To control the starting time. 91 for 92 (int i = 0; i < 10; ++i) 93 { 94 Serial.print((int)(offset+ampl*sin(freq*(i+t)))); 95 96 Serial.print(" "); 97 pwm.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t)))); 98 99 pwm1.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+1)))); 100 pwm2.setPWM(i, 101 0, (int)(offset+ampl*sin(freq*(i+t+2)))); 102 pwm3.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+3)))); 103 104 pwm4.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+4)))); 105 pwm5.setPWM(i, 106 0, (int)(offset+ampl*sin(freq*(i+t+5)))); 107 pwm6.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+6)))); 108 109 pwm7.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+7)))); 110 pwm8.setPWM(i, 111 0, (int)(offset+ampl*sin(freq*(i+t+8)))); 112 pwm9.setPWM(i, 0, (int)(offset+ampl*sin(freq*(i+t+9)))); 113 114 } 115 Serial.println(""); 116 delay(100); 117 t++; 118 } 119} 120
Downloadable files
Schematic
There are 7 PCA9685 servo drivers used in project, and the servos/ power supply are attached on each.
Schematic

Schematic
There are 7 PCA9685 servo drivers used in project, and the servos/ power supply are attached on each.
Schematic

Documentation
Hardware device STL format
The linkage between pins and servo units are not drawn in this assembly file.
Hardware device STL format
Hardware device STP format
The linkage between pins and servo units are not drawn in this assembly file.
Hardware device STP format
Hardware device STP format
The linkage between pins and servo units are not drawn in this assembly file.
Hardware device STP format
Comments
Only logged in users can leave comments