![](/img/trans.png)
[英]How to read servo position and send it to Android for TextView?
[英]how to integrate a servo in a metal detector?
我一直在嘗試在我制作的這個元探測器中添加一個伺服系統,當它檢測到金屬時,伺服系統會旋轉一個指定的角度並在指定的時間內停留並返回到它之前的位置。 但是因為我不知道如何用 c++ 編寫代碼,我認為這是 Arduino Uno 板使用的,所以我一無所知。 我在網上找到了代碼,它目前可以與 LED 一起使用,但我需要它與前面所述的伺服系統一起使用。
使用 led 的代碼
/*
* Metal detector
* We use the code of this project,
* with minor changes:
* https://www.instructables.com/id/Simple-Arduino-Metal-Detector/
*/
const byte npulse = 12; // number of pulses to charge the capacitor before each measurement
const byte pin_pulse = A0; // sends pulses to charge the capacitor (can be a digital pin)
const byte pin_cap = A1; // measures the capacitor charge
const byte pin_LED = 12; // LED that turns on when metal is detected
void setup() {
pinMode(pin_pulse, OUTPUT);
digitalWrite(pin_pulse, LOW);
pinMode(pin_cap, INPUT);
pinMode(pin_LED, OUTPUT);
digitalWrite(pin_LED, LOW);
}
const int nmeas = 256; //measurements to take
long int sumsum = 0; //running sum of 64 sums
long int skip = 0; //number of skipped sums
long int diff = 0; //difference between sum and avgsum
long int flash_period = 0; //period (in ms)
long unsigned int prev_flash = 0; //time stamp of previous flash
void loop() {
int minval = 2000;
int maxval = 0;
//perform measurement
long unsigned int sum = 0;
for (int imeas = 0; imeas < nmeas + 2; imeas++) {
//reset the capacitor
pinMode(pin_cap, OUTPUT);
digitalWrite(pin_cap, LOW);
delayMicroseconds(20);
pinMode(pin_cap, INPUT);
//apply pulses
for (int ipulse = 0; ipulse < npulse; ipulse++) {
digitalWrite(pin_pulse, HIGH); //takes 3.5 microseconds
delayMicroseconds(3);
digitalWrite(pin_pulse, LOW); //takes 3.5 microseconds
delayMicroseconds(3);
}
//read the charge on the capacitor
int val = analogRead(pin_cap); //takes 13x8=104 microseconds
minval = min(val, minval);
maxval = max(val, maxval);
sum += val;
//determine if LEDs should be on or off
long unsigned int timestamp = millis();
byte ledstat = 0;
if (timestamp < prev_flash +12) {
if (diff > 0)ledstat = 1;
if (diff < 0)ledstat = 2;
}
if (timestamp > prev_flash + flash_period) {
if (diff > 0)ledstat = 1;
if (diff < 0)ledstat = 2;
prev_flash = timestamp;
}
if (flash_period > 1000)ledstat = 0;
//switch the LEDs to this setting
if (ledstat == 0) {
digitalWrite(pin_LED, LOW);
}
if (ledstat == 1) {
digitalWrite(pin_LED, LOW);
}
if (ledstat == 2) {
digitalWrite(pin_LED, HIGH);
}
}
//subtract minimum and maximum value to remove spikes
sum -= minval; sum -= maxval;
//process
if (sumsum == 0) sumsum = sum << 6; //set sumsum to expected value
long int avgsum = (sumsum + 32) >> 6;
diff = sum - avgsum;
if (abs(diff)<avgsum >> 10) { //adjust for small changes
sumsum = sumsum + sum - avgsum;
skip = 0;
} else {
skip++;
}
if (skip > 64) { // break off in case of prolonged skipping
sumsum = sum << 6;
skip = 0;
}
// one permille change = 2 ticks/s
if (diff == 0) flash_period = 1000000;
else flash_period = avgsum / (2 * abs(diff));
}
我試過做我在 yt 教程中看到的事情,但只要我嘗試任何事情,它就會停止工作。 如果你們能幫助我,那就太好了,因為我有一個即將到來的項目截止日期。 這是我嘗試使用的代碼
/*
Metal detector
We use the code of this project,
with minor changes:
https://www.instructables.com/id/Simple-Arduino-Metal-Detector/
*/
#include <Servo.h>
Servo servo1;
int servoPin = 9;
const byte npulse = 12; // number of pulses to charge the capacitor before each measurement
const byte pin_pulse = A0; // sends pulses to charge the capacitor (can be a digital pin)
const byte pin_cap = A1; // measures the capacitor charge
const byte pin_LED = 12; // LED that turns on when metal is detected
void setup() {
servo1.attach(servoPin);
pinMode(pin_pulse, OUTPUT);
digitalWrite(pin_pulse, LOW);
pinMode(pin_cap, INPUT);
pinMode(pin_LED, OUTPUT);
digitalWrite(pin_LED, LOW);
}
const int nmeas = 256; //measurements to take
long int sumsum = 0; //running sum of 64 sums
long int skip = 0; //number of skipped sums
long int diff = 0; //difference between sum and avgsum
long int flash_period = 0; //period (in ms)
long unsigned int prev_flash = 0; //time stamp of previous flash
void loop() {
int minval = 2000;
int maxval = 0;
//perform measurement
long unsigned int sum = 0;
for (int imeas = 0; imeas < nmeas + 2; imeas++) {
//reset the capacitor
pinMode(pin_cap, OUTPUT);
digitalWrite(pin_cap, LOW);
delayMicroseconds(20);
pinMode(pin_cap, INPUT);
//apply pulses
for (int ipulse = 0; ipulse < npulse; ipulse++) {
digitalWrite(pin_pulse, HIGH); //takes 3.5 microseconds
delayMicroseconds(3);
digitalWrite(pin_pulse, LOW); //takes 3.5 microseconds
delayMicroseconds(3);
}
//read the charge on the capacitor
int val = analogRead(pin_cap); //takes 13x8=104 microseconds
minval = min(val, minval);
maxval = max(val, maxval);
sum += val;
//determine if LEDs should be on or off
long unsigned int timestamp = millis();
byte ledstat = 0;
if (timestamp < prev_flash + 12) {
if (diff > 0)ledstat = 1;
if (diff < 0)ledstat = 2;
}
if (timestamp > prev_flash + flash_period) {
if (diff > 0)ledstat = 1;
if (diff < 0)ledstat = 2;
prev_flash = timestamp;
}
if (flash_period > 1000)ledstat = 0;
//switch the LEDs to this setting
if (ledstat == 0) {
digitalWrite(pin_LED, LOW);
}
if (ledstat == 1) {
digitalWrite(pin_LED, LOW);
}
if (ledstat == 2) {
digitalWrite(pin_LED, HIGH);
}
if (pin_LED, LOW) {
servo1.write(0);
delay(1000);
}
if (pin_LED, HIGH) {
servo1.write(90);
delay(1000);
}
}
//subtract minimum and maximum value to remove spikes
sum -= minval; sum -= maxval;
//process
if (sumsum == 0) sumsum = sum << 6; //set sumsum to expected value
long int avgsum = (sumsum + 32) >> 6;
diff = sum - avgsum;
if (abs(diff)<avgsum >> 10) { //adjust for small changes
sumsum = sumsum + sum - avgsum;
skip = 0;
} else {
skip++;
}
if (skip > 64) { // break off in case of prolonged skipping
sumsum = sum << 6;
skip = 0;
}
// one permille change = 2 ticks/s
if (diff == 0) flash_period = 1000000;
else flash_period = avgsum / (2 * abs(diff));
}
您需要發布您編寫的實際代碼,但該代碼不起作用,以便我們提供幫助。 你讀過 Arduino Servo 教程了嗎? 控制伺服器與打開和關閉 LED 不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.