###### tags: `Arduino` # Mega2560 potentiometer simulation Using PWM to control the ouput voltage of digital pin for one **Arduino Mega2560**. ## pinout |Board|SCL|SDA| |-|-|-| |Uno|A5|A4| |Nano|A5|A4| |Mega2560|21|20| ## Index control by code ```cpp= float index[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; //Volt void setup(){ PORTD = B11111100; //output PORTB = B111111; } int volt(float n, float m){ //(target volt, maximum volt) return int(map(n,0,m,0,255)); } void loop(){ for(int i=0;i<12;i++) analogWrite(i+2, volt(index[i],5.8)); delay(10); } ``` ## Index control by Serial port ```cpp= float index[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; //Volt String mode = ""; int pin = 2; void setup(){ PORTD = B11111100; PORTB = B111111; Serial.begin(9600); } void loop(){ if(Serial.available()){ float value = Serial.parseFloat(); //value from 10~58 int tmp = int(value); switch(tmp){ //mode switch case 0: mode = "pin"; Serial.println("pin"); //pin select break; case 1: mode = "value"; Serial.println("value"); //value set break; default: if(mode == "pin"){ pin = tmp; Serial.print("pin change "); Serial.println(pin); } if(mode == "value"){ index[pin-2] = value/10; // value/=10 Serial.print("value change "); Serial.println(value/10); } } } for(int i=0;i<12;i++) analogWrite(i+2, map(index[i],0,5.8,0,255)); delay(100); } ``` # Multi board control by Serial ## Commend * -1 : slave board select * -2 : pin change select * -3 : value change order (from 10~58) ## Master (for any board) ```cpp= #include <Wire.h> String mode = ""; int slv_sel = 0; //slave select byte pin_sel = 0; //pin select void setup(){ Wire.begin(); Serial.begin(9600); } void loop(){ if(Serial.available()){ float value = Serial.parseFloat(); int tmp = int(value); switch(tmp){ case -1: mode = "slave select"; Serial.println(mode); break; case -2: mode = "pin select"; Serial.println(mode); break; case -3: mode = "value change"; Serial.println(mode); break; default: if(mode == "slave select"){ slv_sel = tmp; Serial.print("slave select "); Serial.println(slv_sel); } if(mode == "pin select"){ pin_sel = tmp; Serial.print("pin select "); Serial.println(pin_sel); } if(mode == "value change"){ byte x = tmp; Wire.beginTransmission(slv_sel); Wire.write(pin_sel); Wire.write(x); Wire.endTransmission(); Serial.print("value change "); Serial.println(x); } break; } } delay(100); } ``` ## Slave template (for Mega2560) ```cpp= #include <Wire.h> float data[12] = {0,0,0,0,0,0,0,0,0,0,0,0}; //value data int pin = 0; float val = 0; int add = 1; //slave add void setup(){ DDRD = B111111; DDRB = B11111100; Wire.begin(add); Wire.onReceive(receive); Serial.begin(9600); } void loop(){ for(int i=0;i<12;i++){ analogWrite(i+2,map(data[i],0,5.8,0,255)); } delay(100); } void receive(int n){ pin = Wire.read(); val = Wire.read(); val /= 10; data[pin-2] = val; Serial.print("pin select "); Serial.println(pin); Serial.print("val change "); Serial.println(val); } ```