Добрый день, форумчане. Прошу о помощи с моим первым проектом,так что возможны какие-то глупые вопросы. Имеем: штекер на джек 3,5, подключенный к ардуино, 4 сервопривода и 2 светодиода. Смысл устройства: джек подключается к источнику музыки, ардуино получает сигналы, меняет их слегка и передает в сервы, чтобы они поворачивались на разные углы, а светодиоды моргали в такт. Программа максимально простая и честно стащена с просторов интернетов, слегка измененная. Сервы, как известно, довольно прожорливы, потому подглядев один из проектов, нашла Крону и думала питать через нее. Однако, видимо, волтаж слишком велик или же еще чего, но сервы отказываются работать нормально. При подключении третей сервы они почти замирают. Одна из серв, даже если ее подключить в одиночку и вовсе просто вертит рычаг по кругу. Отсюда вопросы: 1. Чем запитать сервы? Возможно 4 обычными батарейками? 2. Возможно есть смысл купить какой-то шилд? 3. Или же косяк кроется в коде? Приложу его на всякий случай. Буду благодарна любым рекомендациям и советам. Код (C++): /* Make a Servo Move to Sound. This example code is in the public domain. 2012 by Cenk Özdemir */ // for servo stuff we include the servo library #include <Servo.h> // creating a servo object Servo myservo1; Servo myservo2; Servo myservo3; Servo myservo4; // Some Varuables we need int ServoPinHand1 = 8; int ServoPinHand2 = 9; int ServoPinLeg1 = 10; int ServoPinLeg2 = 11; int SoundInPinLeft = A0; int SoundInPinRight = A1; int LedPin1 = 2; int LedPin2 = 3; int val = 0; int va2 = 0; // the setup routine runs once when you press reset: void setup() { // initialize myservo1.attach(ServoPinHand1); myservo2.attach(ServoPinHand2); myservo3.attach(ServoPinLeg1); myservo4.attach(ServoPinLeg2); pinMode(SoundInPinLeft, INPUT); pinMode(SoundInPinRight, INPUT); pinMode(LedPin1, OUTPUT); pinMode(LedPin2, OUTPUT); } // the loop routine runs over and over again forever: void loop() { // read the input on analog pin 0: int sensorValueLeftLeg = analogRead(SoundInPinLeft); int sensorValueRightLeg = analogRead(SoundInPinLeft); int sensorValueLeftHand = analogRead(SoundInPinRight); int sensorValueRightHand = analogRead(SoundInPinRight); // we Maop a nother value of this for LED that can be a integer betwen 0..255 int LEDValue = map(sensorValueRightHand,0,150,0,255); // We Map it here down to the possible range of servo moovment. sensorValueLeftLeg = map(sensorValueLeftLeg,0,150,0,180); sensorValueRightLeg = map(sensorValueRightLeg,0,150,0,180); sensorValueLeftHand = map(sensorValueLeftHand,0,150,0,180); sensorValueRightHand = map(sensorValueRightHand,0,150,0,180); // note normaly the 512 is 1023 becouse of analog reading shud go so far, but i changed that to get better readings. myservo1.write(90); myservo2.write(90); myservo3.write(90); myservo4.write(90); // setting the servo into standard position int MoveDelayValueLeftHand = map(sensorValueLeftHand,0,255,0,sensorValueLeftHand); int MoveDelayValueRightHand = map(sensorValueRightHand,0,255,0,sensorValueRightHand); int MoveDelayValueLeftLeg = map(sensorValueLeftLeg,0,255,0,sensorValueLeftLeg); int MoveDelayValueRightLeg = map(sensorValueRightLeg,0,255,0,sensorValueRightLeg); // maping the same reading a little bit more down to calculate the time your servo gets to make the one Move if (sensorValueLeftHand > 33) if (sensorValueRightHand > 33) if (sensorValueLeftLeg > 33) if (sensorValueRightLeg > 33){ // to cut off some static readings only if the reading gets higher then 33 it begings to work delay(1); // a static delay to smooth things out... // now move the servo to our mapped reading myservo1.write(sensorValueLeftHand); myservo2.write(sensorValueRightHand); myservo3.write(sensorValueLeftLeg); myservo4.write(sensorValueRightLeg); // turn led on with the calculated value for it val = analogRead(SoundInPinRight); analogWrite(LedPin1, val * 111); va2 = analogRead(SoundInPinLeft); analogWrite(LedPin2, va2 * 111); // and do that move in this delay time delay(MoveDelayValueRightHand); delay(MoveDelayValueLeftHand); delay(MoveDelayValueRightLeg); delay(MoveDelayValueLeftLeg); }// Done. now we close that part. // turn off the led again. analogWrite(LedPin1, 0); analogWrite(LedPin2, 0); // and this repeats all the time. }
Оно, может, и так. Я учту. Говорю же - видела в одной и статей подобное питание на 3 сервы, подумала, что и тут сработает. В таком случае вопрос в том, чем именно питать?
блок питания на 5-9 В 1А, либо 4 батарейки последовательно (чем толще, тем дольше будет работать), либо два аккумулятора 18650 последовательно.
Питание самой ардуино планируется оставить от пк, так что не страшно. Куплю отсек и протестирую, спасибо огромное за грамотный, понятный и столь быстрый ответ. Добра Вам. upd: все заработало, благодарю за помощь еще раз! и как выяснилось, одна серва тупила не просто так, а она оказалась постоянного вращения, просто продавец не удосужился это указать