Вожусь с 3-осным акселерометром MMA7361. Собрал вот такую конструкцию: акселерометр (через Troyka Shield) связан с Arduino Mega 2560. Сам акселерометр сидит на спарке из двух серв (панорамная + тангажная). Сервы крутятся - программа меряет показания с выходов X,Y,Z акселерометра. Все пины акселерометра заведены на соотв входы Меги. В программе используется библиотека AcceleroMMA7361.h. Библиотека позволяет читать с выходов XYZ три вида значений - Raw, Volt, Accel. Нигде в header'e библиотеки (ни в datasheet'e на Freescal'овский чип MMA7361) явно не указан четкий смысл этих трех видов значений. Разъясните, кто знает или дайте ссылку, плз! Из общих соображений понятно, что Raw и Volt как-то связаны с замерами координат, а Accel - с замером ускорений. Программа получилась такая: Код (Text): // 3-осевой акселерометр MMA7361 DFRobot (библиотека AcceleroMMA7361) // Акселерометр <-> Arduino Mega 2560: X - A10; Y - A11; Z - A12; Vcc - 3,3V; GND - GND; // ST - 50; 0gD - 48; SLP - 46; // Функция настройки акселерометра: begin(SLP,ST,0gD,gSelect,X,Y,Z); // на этом устройстве нет пина для gSelect - есть ручной переключатель - // - 1.5G - 6G - я его выставил в 6G - 206 mV/g - high sensitivity // Сервы: MyServo1 (панорамный) - 8 (PWM); MyServo2 (тангаж) - 9 (PWM) // Используем 3 библ. функции для снятия показ-й (???): getXRaw(); getXVolt(); getXAccel() #include <Servo.h> #include <AcceleroMMA7361.h> byte PinX = 10; byte PinY = 11; byte PinZ = 12; // аналог. выводы XYZ акселер-ра int RawX; int RawY; int RawZ; // значения Raw XYZ с акселерометра int VoltX; int VoltY; int VoltZ; // значения Volt XYZ с акселерометра int AclrX; int AclrY; int AclrZ; // значения Aclr XYZ с акселерометра byte Angle=0; // угол на сервы int StartButton=40; // кнопка ПУСК int GreenLED=30; int YellowLED=32; // светодиоды Servo MyServo1; Servo MyServo2; AcceleroMMA7361 Myaccel; void setup() { Serial.begin(9600); pinMode(StartButton, INPUT); pinMode(GreenLED, OUTPUT); pinMode(YellowLED, OUTPUT); MyServo1.attach(8); MyServo2.attach(9); // attache servos // сервы крутим в диапазоне 30 - 150 градусов MyServo1.write(30); MyServo2.write(30); // сервы в исходное Myaccel.begin(46,50,48,52, A10, A11, A12); Myaccel.setARefVoltage(3.3); // sets the AREF voltage to 3.3V Myaccel.setSensitivity(HIGH); // sets the sensitivity to +/-6G - fake Myaccel.calibrate(); Serial.println(); Serial.println(" === Accelero: Moving Servos - Reading Raw & Volt XYZ ==="); } void loop() { digitalWrite(GreenLED,LOW); digitalWrite(YellowLED,HIGH); while (digitalRead(StartButton)==LOW) {} // ждем кнопку ПУСК digitalWrite(GreenLED,HIGH); digitalWrite(YellowLED,LOW); // поехали Serial.println(); Serial.print("Angle="); Serial.print("\t"); // печать заголовка данных Serial.print("RawX="); Serial.print("\t"); Serial.print("RawY="); Serial.print("\t"); Serial.print("RawZ="); Serial.print("\t"); Serial.print("VoltX="); Serial.print("\t"); Serial.print("VoltY="); Serial.print("\t"); Serial.println("VoltZ="); Serial.println("=== Forward Cycle"); // цикл "туда" for (Angle=30; Angle<=150; Angle=Angle+30) { MyServo1.write(Angle); // поворачиваем сервы (обе) MyServo2.write(Angle); delay(500); RawX = Myaccel.getXRaw(); // читаем Raw RawY = Myaccel.getYRaw(); RawZ = Myaccel.getZRaw(); VoltX = Myaccel.getXVolt(); // читаем Volt VoltY = Myaccel.getYVolt(); VoltZ = Myaccel.getZVolt(); Serial.print(Angle); Serial.print("\t"); Serial.print(RawX); Serial.print("\t"); Serial.print(RawY); Serial.print("\t"); Serial.print(RawZ); Serial.print("\t"); Serial.print(VoltX); Serial.print("\t"); Serial.print(VoltY); Serial.print("\t"); Serial.println(VoltZ); } // цикл "туда" закончен Serial.println("=== Backward Cycle"); // цикл "обратно" for (Angle=150; Angle>=30; Angle=Angle-30) { MyServo1.write(Angle); // поворачиваем сервы (обе) MyServo2.write(Angle); delay(500); RawX = Myaccel.getXRaw(); // читаем Raw RawY = Myaccel.getYRaw(); RawZ = Myaccel.getZRaw(); VoltX = Myaccel.getXVolt(); // читаем Volt VoltY = Myaccel.getYVolt(); VoltZ = Myaccel.getZVolt(); Serial.print(Angle); Serial.print("\t"); Serial.print(RawX); Serial.print("\t"); Serial.print(RawY); Serial.print("\t"); Serial.print(RawZ); Serial.print("\t"); Serial.print(VoltX); Serial.print("\t"); Serial.print(VoltY); Serial.print("\t"); Serial.println(VoltZ); } // цикл "обратно" закончен // теперь меряем ускорение: гоним сервы из 30 в 150 и обратно и // 8 раз меряем ускорение с интервалом 5 мс Serial.println(); Serial.print("AclrX="); Serial.print("\t"); Serial.print("AclrY="); Serial.print("\t"); Serial.println("AclrZ="); // туда MyServo1.write(150); MyServo2.write(150); // сервы 30 -> 150 for (int i=1; i<=8; i++) { delay(5); AclrX = Myaccel.getXAccel(); AclrY = Myaccel.getYAccel(); AclrZ = Myaccel.getZAccel(); Serial.print(AclrX); Serial.print("\t"); Serial.print(AclrY); Serial.print("\t"); Serial.println(AclrZ); } delay(500); // обратно MyServo1.write(30); MyServo2.write(30); // сервы 150 -> 30 for (int i=1; i<=8; i++) { delay(5); AclrX = Myaccel.getXAccel(); AclrY = Myaccel.getYAccel(); AclrZ = Myaccel.getZAccel(); Serial.print(AclrX); Serial.print("\t"); Serial.print(AclrY); Serial.print("\t"); Serial.println(AclrZ); } } В результате трех пусков в совершенно одинаковых условиях (три раза нажимал кнопку ПУСК) получил распечатку довольно-таки различающихся цифр: Код (Text): Calibrating MMA7361011.................................................. DONE === Accelero: Moving Servos - Reading Raw & Volt XYZ === 1-й пуск Angle= RawX= RawY= RawZ= VoltX= VoltY= VoltZ= === Forward Cycle 30 509 481 760 1643 1550 2449 60 509 492 760 1643 1585 2449 90 510 501 758 1643 1620 2442 120 509 496 755 1640 1653 2433 150 509 487 750 1640 2368 2420 === Backward Cycle 150 509 477 749 1640 1537 2413 120 509 489 754 1640 1533 2429 90 509 775 760 1640 2500 2449 60 509 498 761 1640 1601 2452 30 509 550 761 1643 1517 2452 AclrX= AclrY= AclrZ= -1 10 100 -1 -6 100 -1 -9 100 -1 -8 98 -1 33 100 -1 -11 99 -1 -7 100 -1 5 97 -2 -3 95 -1 -6 95 -3 -2 94 -1 -3 94 -2 -5 95 -1 12 95 -1 16 95 -1 22 94 2-й пуск Angle= RawX= RawY= RawZ= VoltX= VoltY= VoltZ= === Forward Cycle 30 509 412 762 1640 1327 2458 60 509 425 763 1640 1369 2455 90 509 536 760 1640 1727 2452 120 509 771 757 1640 2487 2439 150 509 529 751 1640 1704 2420 === Backward Cycle 150 509 507 750 1640 1633 2416 120 509 463 755 1640 1492 2429 90 508 477 759 1640 1533 2449 60 509 459 762 1640 1479 2455 30 509 449 762 1640 1446 2455 AclrX= AclrY= AclrZ= -2 -26 100 -2 -25 100 -2 -25 100 -2 -31 102 -1 -23 99 -2 -26 100 -2 -24 99 -1 -29 100 -2 -18 95 -2 -15 95 -2 -12 96 -3 -8 94 -2 -7 95 -2 -11 95 -2 -15 94 -2 -16 95 3-й пуск Angle= RawX= RawY= RawZ= VoltX= VoltY= VoltZ= === Forward Cycle 30 508 515 762 1640 1659 2458 60 508 553 763 1637 1772 2458 90 508 497 760 1637 1601 2449 120 508 492 756 1637 1582 2436 150 508 488 750 1637 1575 2416 === Backward Cycle 150 508 372 749 1637 1198 2416 120 508 392 755 1637 1263 2433 90 508 509 760 1637 1640 2449 60 508 413 762 1637 1330 2455 30 508 413 761 1637 1330 2452 AclrX= AclrY= AclrZ= -2 -37 99 -2 -40 100 -2 -39 100 -2 -49 102 -1 -41 100 -2 -42 99 -2 -40 99 -2 -45 100 -2 7 95 -2 22 95 -2 26 96 -3 26 94 -2 10 94 -2 8 95 -2 -1 94 -2 10 95 Вопрос: три вида значений - Raw, Volt, Accel - это что? почему в одинаковых условиях (как мне кажется) различаются цифры? Спасибо
Из документации к библиотеке: Первая функция отдает результат analogRead() как есть, остальные две масштабируют его в [милли]вольты и [сотые] единицы G.