Форум по Роботика
Технически форум => Общ форум => Темата е започната от: INF1n1t в Август 28, 2007, 04:03:28 pm
-
http://www.deltron-euroind.it/pdf/avvisatori_acustici/buzzer_circuito_stampato/senza_driver_elettro.pdf
Тук има и информация за това, но все още не съм сигурен точно какво е. Казват, че е magnetic transducer. От уикипедия проверих, ама не пише точно.
Да кажа само, че намерих елемента на една модемна платка...
-
ми аз мился , че е пиезо зумер
-
ми аз мился , че е пиезо зумер
На мен ми прилича на някакъв магнетрон (измерващ магнитното поле)... Вероятно в модема е бил някъде до изхода? :)
Поздрави!
-
май братле си прав ама за какво да измерва магнитното поле , че не разбирам мн от модеми :D
-
Амм не. Всъщност ти какво разбираш под изход? Ако разбираш мястото, където се включват кабелите, значи не е близо до изхода а точно обратното - възможно най-далече е.
-
Това си е чист пиезоизлъчвател... Видях думата "magnetic transducer", а на чертежите - "frequency" и съм се подвел. :) А и в заглавието на линка пише buzzer - а тази дума значи високоговорител, пиезоизлъчвател.. :) Така че няма нищо интересно в това - има го и в китайските будилници! Аз си го отрязах от един будилник, може да направя робот, който да пищи при определена команда... :) Поздрави!
-
Ааа това ли било! :) Сигурно може да се вгради някъде за бъзик..
-
Бе и аз гледам има показана честота и сила на звука , ама винаги има несигурност :D :D
-
Еми тия дни мисля да хвана поялника, защото имам три платки с доза елементи на тях. Ако успея да го разпоя този елемент, може да го сложа някъде другаде и да го опитам (трябва да изуча и начинът му на работа)
-
ами батка ако му подаваш правоъгълни импуси с ралична честота , може да мениш честотата на издавания звук ;) . Аз не съм го прабвал , но го четох в една книга .
-
Мдам, благодаря, че ме улесни :)
-
Такам, точно така. Значи това си е пиезоговорителче (писукче, buzzer-че, пищялка, абе там както и да е - издава звук). За да можете да го управлявате се оказа, че просто трябва да му давате, както tommyboy каза, правоъгълни импулси с определена честота.
400 Hz звук, означава да има 400 изменения в секунда. Значи трябва да подадеме 400 импулса. За да ги подадеме толкова импулси, трябва да правиме два пъти повече промени, за което ме подсети datamatrix. Тоест, трябва да имаме 800 изменения в секунда за 400 Hz звук. Дотук всичко е добре, а ето малко C код за подкарване на buzzer:
counter=250;
while (counter)
{
output_high(PIN_B1);
delay=5000;
delay_us(delay);
output_low(PIN_B1);
counter--;
}
Програмата работи за 4 MHz PIC 16F84A. delay_us ще забави с x ултрасекунди. Всъщност, логиката е следната - за една секунда имаме 4 милиона изменения (4Mhz). Колко трябва да ни е забавянето, ако искаме 800 изменения. Ами 4 000 000 / 800, и ни се получава 5000. Нагласяме delay_us(5000) и сме напълно готови - имаме 800 изменения в секунда, а всъщност 400 Hz звук.
Честотата на звука е добре, но силата му? Последователно на buzzer-а, сме свързали някакъв резистор (според каталога на елемента). Според съпротивлението протича даден ток x. Колкото е по-голям този ток, толкова по-силен звук имаме. Най-хубаво е това да се проследи с потенциометър.
Ами общо взето това е. Имах някакви проблеми с пиезоговорителя, затова реших, че може да е от полза и да улесни тези, които тепърва ще се занимават с такъв елемент.
-
Ултрасекунди? Може би микросекунди :)
Много хубаво си го направил, но работи ли :)
Защото според мен ако искаш сигнала да е правоъгълен трябва да има забавяне между всяко "изменение", а ти си направил забавяне само между high и low (трябва и между low и high, тоест след low)
Освен това, delay_us работи с микросекунди, а не трептенията на процесора, за това няма значение каква е неговата скорост, delay_us(1000000) винаги ще забавя с една секунда -> в твоя случай ако искаш честота 400 Hz ти трябват 1000000/400 = 2500 us дължина на вълната (от low до low или от high до high), т.е. две забавяния от по 1250 us.
*Също така не е хубаво да правиш забавянето с delay функция, защото какво става: правиш 800 забавяния от по 1250 us -> 1000000 us = 1 s ти е общо забавянето, но всяка операция отнема време на процесора, включително и output_high(), =, output_low(), --, затова времето за тези 400 трептения които искаш да създадеш ще е 1 s + 250 * (O(output_high()) + O(=) + O(output_low()) + O(--) + O(==)). По е добре да се ползват таймери, уви при микроконтролерите нзн как стоят нещата с тях, така че ето код с delay:
#define OUTPUT_TIME 2
#define FREQUENCY 400
...
int delay = 500000 / FREQUENCY;
for (int i = 0; i < OUTPUT_TIME * FREQUENCY; ++i) {
output_high (PIN_B1);
delay_us (delay);
Output_low (PIN_B1);
delay_us (delay);
}
*EDIT: sv_shady ме светна че това не е точно така, така че се извинявам по тази точка. Другите обаче си остават :)
-
Ултрасекунди? Може би микросекунди :)
Много хубаво си го направил, но работи ли :)
Защото според мен ако искаш сигнала да е правоъгълен трябва да има забавяне между всяко "изменение", а ти си направил забавяне само между high и low (трябва и между low и high, тоест след low)
Освен това, delay_us работи с микросекунди, а не трептенията на процесора, за това няма значение каква е неговата скорост, delay_us(1000000) винаги ще забавя с една секунда -> в твоя случай ако искаш честота 400 Hz ти трябват 1000000/400 = 2500 us дължина на вълната (от low до low или от high до high), т.е. две забавяния от по 1250 us.
*Също така не е хубаво да правиш забавянето с delay функция, защото какво става: правиш 800 забавяния от по 1250 us -> 1000000 us = 1 s ти е общо забавянето, но всяка операция отнема време на процесора, включително и output_high(), =, output_low(), --, затова времето за тези 400 трептения които искаш да създадеш ще е 1 s + 250 * (O(output_high()) + O(=) + O(output_low()) + O(--) + O(==)). По е добре да се ползват таймери, уви при микроконтролерите нзн как стоят нещата с тях, така че ето код с delay:
#define OUTPUT_TIME 2
#define FREQUENCY 400
...
int delay = 500000 / FREQUENCY;
for (int i = 0; i < OUTPUT_TIME * FREQUENCY; ++i) {
output_high (PIN_B1);
delay_us (delay);
Output_low (PIN_B1);
delay_us (delay);
}
*EDIT: sv_shady ме светна че това не е точно така, така че се извинявам по тази точка. Другите обаче си остават :)
Здравей, благодаря за допълненията. Първо да кажа, моят код работи. Поне при мен. Проблемът всъщност е че аз не ви дадох целият код. Ето я цялата програма:
#include <16F84A.h>
#fuses XT, NOWDT, NOPROTECT, PUT
#use delay(clock=4000000)
void main()
{
int counter;
int delay;
while (1)
{
output_high(PIN_B2);
delay_ms(500);
output_low(PIN_B2);
output_high(PIN_B3);
delay_ms(500);
output_low(PIN_B3);
counter=250;
while (counter)
{
output_high(PIN_B1);
delay=10000;
delay_us(delay);
output_low(PIN_B1);
counter--;
}
counter=250;
while (counter)
{
output_high(PIN_B1);
delay=5000;
delay_us(delay);
output_low(PIN_B1);
counter--;
}
counter=250;
while (counter)
{
output_high(PIN_B1);
delay=5000;
delay_us(delay);
output_low(PIN_B1);
counter--;
}
}
}
Тук всичко работи само единствения проблем, е че както ти казваш трябва да има забавяне между трите цикъла, защото иначе онова изговаря тоновете прекалено бързо.
Ултрасекунди е равно на микросекунди по моему :)
Дам, това не го знаех за delay_us() и ги бях сметнал през тактовата честота.
-
няма ли да ви е по лесно с един 555 вместо да пишете програми ;)
-
@tommyboy Ами то писането на една такава програма не отнема повече от 5 мин., така че не виждам кое му е сложното :)
@INF1n1t За съжеление мозъка ми се е изкривил да мисли алгоритмично и това:counter=250;
while (counter)
{
output_high(PIN_B1);
delay=10000;
delay_us(delay);
output_low(PIN_B1);
counter--;
}
напрао ми бърка в очите, моля те изкарай го тоя delay = 10000; извън цикъла, че шсе побъркам ;)
Така и така не се променя, едно присвояване е достатъчно :)
-
Абе тия компилатори за различните мцу-та нямат ли оптимизатори?
Първо - оптимизатора би трябвало сам да го изкара от цикъла, и второ да забележи че не се променя и да го замени където трябва.
Разбира се - ако няма оптимизатор - тъпа "грешка"
Сещам се за една книжка за добър стил на програмиране в която имаше доста сериозни грешки предизвикане точно от неразбиране какво кога става и какво прави оптимизатора. Може да я кача - ако не за друго, то поне защото на почти всяка страница имаше весели случки.
-
Абе вие сте ебаси хората, бе! Какво толкова му има...какво ти се е изкривил мозъка па на тебе. Дразнат ме тия истории, са тоя код съм го дал примерно, за какво трябва да се хващате са глупости. Разбирам да правя ядрени опити - не правя. Едно просто buzzer-че. Онзи код, който дадох бачка и лично съм го пробвал.
Methuselah, лично за gcc има си опции за това какво може и не може да прави оптимизатора и с цената на какво. За други компилатори не знам.
-
Абе вие сте ебаси хората, бе! Какво толкова му има...какво ти се е изкривил мозъка па на тебе. Дразнат ме тия истории, са тоя код съм го дал примерно, за какво трябва да се хващате са глупости. Разбирам да правя ядрени опити - не правя. Едно просто buzzer-че. Онзи код, който дадох бачка и лично съм го пробвал.
Methuselah, лично за gcc има си опции за това какво може и не може да прави оптимизатора и с цената на какво. За други компилатори не знам.
Споко бе пич, не се нерви ;) Мене мозъка ми си е изкривен от практиката :). Просто ти казвам че ще е по-красиво от програмистска гледна точка. Целта ми не е да се заяждам с тебе.
-
Ако толкова ви е за красотата айде
counter=250;
while (counter)
{
output_high(PIN_B1);
delay_us(10000);
output_low(PIN_B1);
counter--;
}
Голяма работа, стига спорове. Работи ли - работи. Който не му харесва да си го преработи за него, без да го прави на световен проблем. Аз кодове не поствам, за да не се получават такива разправии.
Ето едно едно код-че от мене да разгадаете какво прави:
#include <16F84A.h>
#fuses XT,NOWDT,NOPROTECT,PUT
#use delay(clock=4000000)
void main()
{
int k=0;
disable_interrupts(GLOBAL);
k=read_eeprom(0);
for ( ; ; )
{
output_b(k);
write_eeprom(0,k);
if(k<15) k++;
else k=0;
delay_ms(1000);
}
}
-
Абе вие сте ебаси хората, бе! Какво толкова му има...какво ти се е изкривил мозъка па на тебе. Дразнат ме тия истории, са тоя код съм го дал примерно, за какво трябва да се хващате са глупости. Разбирам да правя ядрени опити - не правя. Едно просто buzzer-че. Онзи код, който дадох бачка и лично съм го пробвал.
Methuselah, лично за gcc има си опции за това какво може и не може да прави оптимизатора и с цената на какво. За други компилатори не знам.
Споко бе пич, не се нерви ;) Мене мозъка ми си е изкривен от практиката :). Просто ти казвам че ще е по-красиво от програмистска гледна точка. Целта ми не е да се заяждам с тебе.
Извинявай, просто с друго впечатление останах.
Но иначе за втория delay си прав, но което е интересното - работи и без него.
-
Според мен, заради голямата честота не се забелязва разликата, но мисля че ще се усети при по ниска от 50 Hz. И да не говоря празни приказки ето пример:
(http://www.robotics-bg.com/upload/files/sound.jpg)
тук епсилон е времето за което контролера изпълнява функцията output_low(), което е достатъчно голямо, за да може да се чуе звукът при висока честота (напр 200 Hz) и същевременно достатъчно малко за да се усети разликата между двата начина на възпроизвеждане. Надявам се да съм помогнал някакси :)
-
#include <stdio.h>
#include <dos.h>
enum note {C, Cis, D, Dis, E, F, Fis, G, Gis, A, Ais, B};
short freq[12][10] = { {16, 33, 65, 131, 267, 523, 1047, 2093, 4186, 8372},
{17, 35, 69, 139, 277, 554, 1109, 2218, 4435, 8870},
{18, 37, 73, 147, 294, 587, 1175, 2349, 4699, 9397},
{19, 39, 78, 156, 311, 622, 1245, 2489, 4978, 9956},
{21, 41, 82, 165, 327, 659, 1319, 2637, 5274, 10548},
{22, 44, 87, 175, 349, 698, 1397, 2799, 5588, 11175},
{23, 46, 92, 185, 370, 740, 1480, 2960, 5920, 11840},
{25, 49, 98, 196, 392, 784, 1568, 3136, 6272, 12544},
{26, 52, 104, 208, 415, 831, 1661, 3322, 6645, 13290},
{28, 55, 110, 220, 440, 880, 1760, 3520, 7040, 14080},
{29, 58, 117, 233, 466, 932, 1865, 3729, 7459, 14917},
{31, 62, 123, 247, 494, 988, 1976, 3951, 7902, 15804}};
void _sound(enum note n, short octave, short period) {
sound(freq[n][octave]);
delay(period);
nosound();
}
int main () {
_sound(G, 4, 500);
_sound(G, 4, 500);
_sound(G, 4, 500);
_sound(E, 4, 250);
_sound(B, 4, 250);
_sound(G, 4, 500);
_sound(E, 4, 250);
_sound(B, 4, 250);
_sound(G, 4, 1000);
delay(500);
_sound(D, 5, 500);
_sound(D, 5, 500);
_sound(D, 5, 500);
_sound(E, 5, 250);
_sound(A, 4, 250);
_sound(F, 4, 500);
_sound(E, 4, 250);
_sound(B, 4, 250);
_sound(G, 4, 1000);
return 0;
}
Ето програмата с Дарт Вейдъра дето я искаше днеска :) Работи за комп. Ако искаш да заработи и за пиезо зумера трябва да смениш _sound функцията с тази:_sound(enum note n, short octave, long period) {
long delay = 500000 / freq[n][octave];
period *= 1000;
for (long i = 0; (i << 1) * delay < period; ++i) {
output_high (PIN_B1);
delay_us (delay);
output_low (PIN_B1);
delay_us (delay);
}
И dos.h става излишен. Have Fun! :)
-
аве тия прграмки ги пишете на С нали , щото не ми прилича на асемблер
-
аве тия прграмки ги пишете на С нали , щото не ми прилича на асемблер
:shock:
Естетвено че на C :zubi:
-
Може ли една схемичка за такива правоъгълни импулси, че съм далеч от микроконтролерите. :oops: :D
-
аве тия прграмки ги пишете на С нали , щото не ми прилича на асемблер
:shock:
Естетвено че на C :zubi:
що ве може на асемблер ама естествено че е на С верно тъп въпрос зададох. :lol:
-
Малко можете ли да ми разясните какво е асемблер :oops: .(Съжелявам, ако е спам, но искам да използвам тези пиезоизлъчватели, но незнам как :oops: . )
-
За пиезотата въобще не е нужен асемблер. Иначе асемблер е език, който е от възможно най-ниско ниво и представлява машинен код, но в едни вид в който човек може да го възприеме.
-
#include <stdio.h>
#include <dos.h>
enum note {C, Cis, D, Dis, E, F, Fis, G, Gis, A, Ais, B};
short freq[12][10] = { {16, 33, 65, 131, 267, 523, 1047, 2093, 4186, 8372},
{17, 35, 69, 139, 277, 554, 1109, 2218, 4435, 8870},
{18, 37, 73, 147, 294, 587, 1175, 2349, 4699, 9397},
{19, 39, 78, 156, 311, 622, 1245, 2489, 4978, 9956},
{21, 41, 82, 165, 327, 659, 1319, 2637, 5274, 10548},
{22, 44, 87, 175, 349, 698, 1397, 2799, 5588, 11175},
{23, 46, 92, 185, 370, 740, 1480, 2960, 5920, 11840},
{25, 49, 98, 196, 392, 784, 1568, 3136, 6272, 12544},
{26, 52, 104, 208, 415, 831, 1661, 3322, 6645, 13290},
{28, 55, 110, 220, 440, 880, 1760, 3520, 7040, 14080},
{29, 58, 117, 233, 466, 932, 1865, 3729, 7459, 14917},
{31, 62, 123, 247, 494, 988, 1976, 3951, 7902, 15804}};
void _sound(enum note n, short octave, short period) {
sound(freq[n][octave]);
delay(period);
nosound();
}
int main () {
_sound(G, 4, 500);
_sound(G, 4, 500);
_sound(G, 4, 500);
_sound(E, 4, 250);
_sound(B, 4, 250);
_sound(G, 4, 500);
_sound(E, 4, 250);
_sound(B, 4, 250);
_sound(G, 4, 1000);
delay(500);
_sound(D, 5, 500);
_sound(D, 5, 500);
_sound(D, 5, 500);
_sound(E, 5, 250);
_sound(A, 4, 250);
_sound(F, 4, 500);
_sound(E, 4, 250);
_sound(B, 4, 250);
_sound(G, 4, 1000);
return 0;
}
Ето програмата с Дарт Вейдъра
[Linker error] undefined reference to `sound'
[Linker error] undefined reference to `delay'
[Linker error] undefined reference to `nosound'
[Linker error] undefined reference to `delay'
ld returned 1 exit status
Искам да чуя вейдърааа!
-
Струва ми се, че нямаш dos.h
-
Струва ми се, че нямаш dos.h
Имам го. Оказа се че ги няма функциите sound() & delay();
/*
* dos.h
* This file has no copyright assigned and is placed in the Public Domain.
* This file is a part of the mingw-runtime package.
* No warranty is given; refer to the file DISCLAIMER within the package.
*
* DOS-specific functions and structures.
*
*/
#ifndef _DOS_H_
#define _DOS_H_
/* All the headers include this file. */
#include <_mingw.h>
#define __need_wchar_t
#ifndef RC_INVOKED
#include <stddef.h>
#endif /* Not RC_INVOKED */
/* For DOS file attributes */
#include <io.h>
#ifndef RC_INVOKED
#ifdef __cplusplus
extern "C" {
#endif
#ifndef __MSVCRT__ /* these are in CRTDLL, but not MSVCRT */
#ifndef __DECLSPEC_SUPPORTED
extern unsigned int *_imp___basemajor_dll;
extern unsigned int *_imp___baseminor_dll;
extern unsigned int *_imp___baseversion_dll;
extern unsigned int *_imp___osmajor_dll;
extern unsigned int *_imp___osminor_dll;
extern unsigned int *_imp___osmode_dll;
#define _basemajor (*_imp___basemajor_dll)
#define _baseminor (*_imp___baseminor_dll)
#define _baseversion (*_imp___baseversion_dll)
#define _osmajor (*_imp___osmajor_dll)
#define _osminor (*_imp___osminor_dll)
#define _osmode (*_imp___osmode_dll)
#else /* __DECLSPEC_SUPPORTED */
__MINGW_IMPORT unsigned int _basemajor_dll;
__MINGW_IMPORT unsigned int _baseminor_dll;
__MINGW_IMPORT unsigned int _baseversion_dll;
__MINGW_IMPORT unsigned int _osmajor_dll;
__MINGW_IMPORT unsigned int _osminor_dll;
__MINGW_IMPORT unsigned int _osmode_dll;
#define _basemajor _basemajor_dll
#define _baseminor _baseminor_dll
#define _baseversion _baseversion_dll
#define _osmajor _osmajor_dll
#define _osminor _osminor_dll
#define _osmode _osmode_dll
#endif /* __DECLSPEC_SUPPORTED */
#endif /* ! __MSVCRT__ */
#ifndef _DISKFREE_T_DEFINED
/* needed by _getdiskfree (also in direct.h) */
struct _diskfree_t {
unsigned total_clusters;
unsigned avail_clusters;
unsigned sectors_per_cluster;
unsigned bytes_per_sector;
};
#define _DISKFREE_T_DEFINED
#endif
_CRTIMP unsigned __cdecl _getdiskfree (unsigned, struct _diskfree_t *);
#ifndef _NO_OLDNAMES
# define diskfree_t _diskfree_t
#endif
#ifdef __cplusplus
}
#endif
#endif /* Not RC_INVOKED */
#endif /* Not _DOS_H_ */
-
Заповядай (http://www.robotics-bg.com/upload/files/DOS.rar) :) трябва да го преименуваш на DOS.H