Відповісти

Введіть повідомлення і натисніть Надіслати
Параметри

Назад

Огляд теми (нові повідомленні вгорі)

ubertoad
2024-05-01 23:21:20

Є альтернативи tone() на таймерах. Вони зазвичай для одного піна, але не має бути проблем зробити для двох, не думає, що будуть проблеми з продуктивістю.

https://github.com/wlindley/Arduino/tree/master/libraries/NewTone
https://github.com/daniel-centore/arduino-tone-library

Ну і плюс мабуть не викликати той новий tone на кожному кроці loop а тільки коли frequency змінюється.
Якщо підтвердите, що хоч одна з тих бібліотек для вас працює для одного піна - можу за донат на ЗСУ змінити ваш код і код у бібліотеці що працює.

Honey
2024-04-30 22:52:52
martinways пише:

а також щоби ця частота була на виходах 26 та 36, як відомо, tone() може працювати одночасно тільки на одному порті, тому треба зробти якесь швидке перекидання чи якийсь інший фокус, щоби вона була на цих двух портах.

припаяйте перемичку

ubertoad
2024-04-30 14:48:43

Здається у вас реальна проблема тільки з tone. Його можна замінити на таймери наче (і наче tone всередині працює на таймерах).

https://bitbucket.org/teckel12/arduino-new-tone/src/master/ ось код, наприклад. Наче не складно його змінити, щоб не на одному а на двох пінах працювало. Тупо замінити усі *pin* змінні на дві штуки і робити усе двічі, навряд чи продуктивності не вистачить. Ну але я не тестив чи той код взагалі працює) І вам треба буде мабуть викликати той NewTone(pin1, pin2, frequency) не на кожному кроці loop, а тільки коли частота змінилась.

Думаю можу це зробити за донат на ЗСУ, якщо ви підтвердите, що той код працює для вас як є для одного піна.

martinways
2024-04-26 12:49:43

Доброго дня. Є стандартний екран з енкодером RepRapDiscountFullGraphicSmartController, плата RAMPS та Mega 2560.
Також є такий скетч, який робить наступне  - генерується частота за допомогою tone() та виводиться на екран, частота регулються потенціометром. Переробити треба так, щоби частота змінювалась не потенциометром, а енкодером в діапазоні від 1000 до 10000герц з кроком 500гц, а також щоби ця частота була на виходах 26 та 36, як відомо, tone() може працювати одночасно тільки на одному порті, тому треба зробти якесь швидке перекидання чи якийсь інший фокус, щоби вона була на цих двух портах.

#include <U8glib.h>

#define DOGLCD_CS       16
#define DOGLCD_MOSI     17
#define DOGLCD_SCK      23
#define BTN_EN1         31
#define BTN_EN2         33
#define pson            5

const int potPin = A1;
const int StepA = 26;
const int StepB = 36;

int potValue = 0;
int frequency = 1000; 

U8GLIB_ST7920_128X64_1X u8g(DOGLCD_SCK, DOGLCD_MOSI, DOGLCD_CS);
void setup(void) {
  u8g.begin();
  pinMode(StepA, OUTPUT);
  pinMode(StepB, OUTPUT);
  pinMode(pson, OUTPUT);
  u8g.setColorIndex(1);   
}

void loop() {
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_unifont);
    u8g.setPrintPos(30, 30); 
    u8g.print(frequency);
    u8g.print(" Hz");
  } while (u8g.nextPage());

  potValue = analogRead(potPin);
  frequency = map(potValue, 0, 1023, 1000, 10000); 

  tone(StepA,  frequency);
  tone(StepB, frequency);
  
  digitalWrite(pson, HIGH);
}

Підвал форуму