dvogonen / cyclop_plus Goto Github PK
View Code? Open in Web Editor NEWFirmware upgrade for Quanum Cyclops FPV googles that adds support for manual channel selection, external display and battery level alarm.
License: MIT License
Firmware upgrade for Quanum Cyclops FPV googles that adds support for manual channel selection, external display and battery level alarm.
License: MIT License
From pull request by Memphiz:
Just played around with an 0,96" OLED based on SH1106 display (bought this before i realised you had a minimOSD solution available as well ;) ).
There was a corruption when i added a test sketch with your logo on my arduino nano. This pull request fixes this.
Corrupted logo before (see the garbage at column 2):
https://www.dropbox.com/s/6jurxjxnjt8csfz/sh1106_corruption.jpg?dl=0
And here with the bugfix applied:
https://www.dropbox.com/s/ermmt0xhbo77824/sh1106_fine.jpg?dl=0
First of all: Thanks for the great work! The project works really nice!
In my opinion it would be more useful to run through the channels by Band and not ordered by frequency.
Normally you know which band you are on and you don't change that very often. Although e.g. if you are on A7 and want to change to B3, its more obvious to go 4 ch up thant running along the band until you reach B3.
Maybe this could be added as an option to your code (rx5808-pro-diversity has this feature)
To do it hard-wired, all that has to be done is replacing the getPosition function to not use the positions table:
//uint16_t getPosition( uint8_t channel ) {
// return pgm_read_byte_near(positions + channel);
//}
uint16_t getPosition( uint8_t channel ) {
return channel;
}
The minimum RSSI value for detecting a video channel is hard coded to 150. Reports state that this is way to high.
On the other hand the noise floor of some receivers seems to be as high as 100.
This issue is directly associated with issue 6.
Hello Dvogonen,
First of all thank you and congratulation for this so nice project !
It is so usefull to be sure on which frequency we are locked onto !!
Great Job and your user interface is great too !
I found one little bug and I am, for instance, unable to solve it by myself. (I did not understand yet what was the logic behing progmen index, progmem value and frequencies order.)
Here is the bug description :
One can leave with this but on a such well done software it should be a pity not to correct it.
It is looking like two values that are inverted.
I am convinced you will see this in a snap when checking your code... ;-)
Best regards
Marc
When powering up the goggles (3 cell battery) normally, the OLED screen usually will not turn on. I have tested this using both the 5V and 3.3V pins. The only reliable way I have found to make the OLED turn on either by connecting the programing cable with the battery unplugged (not really useful) or by quickly pulsing the power to the goggles before fully powering (i.e. providing power for a fraction of a second and the re-applying normal power.
Here is the code AVRDUDESS gives me when I want to flash the firmware:
avrdude.exe: set SCK frequency to 1500000 Hz
avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude.exe: Device signature = 0x1e950f
avrdude.exe: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: set SCK frequency to 1500000 Hz
avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: reading input file "C:\Users\Justin\Downloads\cyclop_plus.hex"
avrdude.exe: invalid record at line 47 of "C:\Users\Justin\Downloads\cyclop_plus.hex"
avrdude.exe: read from file 'C:\Users\Justin\Downloads\cyclop_plus.hex' failed
tried it with several hex files. Nothing seems to work
I have noticed that the OLED does not always initialise on power up. once it fails it can take 4 or 5 power cycles for it to wake up. Have tried 2 OLED from different vendors. Is this a hardware fault?
Installed 1.4 firmware but when set to 2s and having a fully charged battery i get a constant alarm. Did u miss a step?
Verifying the ino with option #define SH1106_OLED_DRIVE enabled results in errors.
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans0.ltrans.o: In function
drawOptionsScreen(unsigned char, unsigned char)':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1131: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1174: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans0.ltrans.o: In function `drawChannelScreen(unsigned char, unsigned int)':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:942: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:970: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans0.ltrans.o: In function `updateScannerScreen(unsigned char, unsigned char)':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1051: undefined reference to `Adafruit_SH1106::drawFastVLine(int, int, int, unsigned int)'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1054: undefined reference to `Adafruit_SH1106::drawFastVLine(int, int, int, unsigned int)'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1062: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans1.ltrans.o: In function `setup':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:199: undefined reference to `Adafruit_SH1106::begin(unsigned char, unsigned char, bool)'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:201: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:204: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans1.ltrans.o: In function `drawStartScreen':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:909: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:921: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans1.ltrans.o: In function `dissolveDisplay':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:894: undefined reference to `Adafruit_SH1106::drawPixel(int, int, unsigned int)'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:896: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:898: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:899: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans1.ltrans.o: In function `drawFunctionScreen':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:995: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans1.ltrans.o: In function `drawScannerScreen':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1024: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans1.ltrans.o: In function `drawAutoScanScreen':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1003: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1016: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans1.ltrans.o: In function `activateScreenSaver':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1182: undefined reference to `Adafruit_SH1106::clearDisplay()'
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:1183: undefined reference to `Adafruit_SH1106::display()'
C:\Users\Owner\AppData\Local\Temp\ccLrppII.ltrans2.ltrans.o: In function `__static_initialization_and_destruction_0':
C:\Users\Owner\Downloads\cyclop_plus-master\cyclop_plus-master\src\cyclop_plus/cyclop_plus.ino:143: undefined reference to `Adafruit_SH1106::Adafruit_SH1106(signed char)'
collect2.exe: error: ld returned 1 exit status
exit status 1`
The retrieval of channel number from the EEPROM does not work as it should. The receiver always uses the loweast frequency (6545 MHz) after power_on.
The reason is that the EEPROM checksum calculation is faulty. It is also unnecessary and needs to be removed since the only data we need to save this far is the channel number. MaxRSSI and MinRSSI are also stored, but are only useful if the receiver is to be calibrated, which has no meaning yet.
It's not an issue. But this interesting function does it work for you?
Tjänare,
I am building myself a head tracker using and arduino nano and a sensor board:
Now, I do not have a Cyclops myself yet, but I was considering one mostly because of this project.
I realized the sensor module is also wired via i2c, and I was wondering whether the cpu would have enough IO lines and memory/cycles to deal with this task as well..
Just in case the TODO-list might run empty :-)
The alarm sound level is currently fixed. Making it configurable would make it possible to adapt to different buzzers.
3s battery meter not working and buzzer not working period
The short name for raceband channels ar L, not R.
This is wrong. The short name should be R.
When using screen saver and the OLED is dimmed, it would be nice to just wake up OLED with one button press. Now if you press button, OLED wakes up, but also receiver jumps to next channel.
Very nice firmware for cyclops, thx a lot for your contribute to this hobby!
BR
Jani
I got it all flashed and working. However it doesn’t seem to change channels. The frequency changes on the little display but not on the screen i seem to be locked into c1. I have an eachine racer 250 and was able to use it to scan through and connect and the OSD from the quad says voltage flight time and channel comes up as c1. If i use the Frequency scanner with waveform it looks like im broadcasting on every channel. But im not because i had to manually go thru each channel on the quad end to find what channel the reciver was on. Im confused
I can send pictures or video if you need to see it
A graphical band scanner that scans frequencies rather than channel positions would be nice.
It would also be nice to be able to manually select to use any of the active frequencies that are discovered.
Functionality:
The band scanner should be updated in real time and show progress clearly, so it is obvious which part of the spectrum that is being scanneed.
The signal strength is expressed as bar graphs.
The update should be so slow that it is possible to select a fpv frequency by clicking the button when the scanner passes it.
A LONG-LONG should trigger the frequency scan.
A DOUBLE or LONG or LONG-LONG click exits the scan and returns to the previous channel.
A single click chooses any acceptable channel that is close to the scanning position.
Being able to limit which bands are used will make it easier to step between channels. If someone uses the A-band for his transmitter, he/she will not be interested in stepping through all other channels on band b, c etc.
An options menu would be convenient to be able to select if the screen should be flipped or not etc.
Setting the level to values between 1 and 7 produces ever higher sound levels but setting it to 8 produces a sound level lower than 1!
Clearly a bug, but a very minor one.
The initialization code doesn't read the user settings for blacklisted band. If you disable all band except race band, all other bands are available again after reboot. Opening settings menu shows the user done settings as expected.
I just got done doing a slight mod to my Cyclops Goggles.
Added a voltage divider to A2 pin (A1 seems to be mislabeled? It actually goes to A3 so i just decided to use the correctly labeled A2)
I'm using a 10K and 4.7K resistor for the voltage divider. But now that I realize this is a 3.3v based system that won't be good enough for 3s battery sensing. The resistor values are currently configurable in code I have written so anyone can choose a suitable divider for their application.
Open to suggestions of standardizing the resistor values to make it more noob friendly and reduce code complexity.
Still working on the code but figured I would open the discussion
Curtis
The battery alarm sets in to early according to this post by awap at RCGroups:
"Hi, I'm very happy with version 1.4 and the Eachine DVR installed. One whish however: I'm on a 3S battery and the beeper starts at 11.4V (3.8V per cel) and the second level beep starts at 11,2V (3,73V per cel). This is too soon. Is there a way to start the beeper at 3x3.65= 10.95 -11.0 V?"
The behavior is not really a bug, the level was set unnecessarily low.
Hi, thanks for your beautiful piece of firmware.
I'm in search of a display, and stumbled upon this one: http://www.ebay.nl/itm/0-96-I2C-IIC-SPI-Serial-128X64-OLED-LCD-Display-SSD1306-for-51-STM32-Arduino-/302104546088
But it let's me choose the interface. Do I need a display with an SPI interface or an IIC?
The receiver modules are not all created alike. The RSSI output differs significantly for the same signals. This has a direct impact on the display of signal strength in the band scanner. It would be a good thing to be able to calibrate the min and max values
Hi, tested yesterday: if screensaver is on, and I lower the input voltage from my bench supply, there is no battery warning. Battery warning kicks in if button is pressed, and oled leaves screensaver mode.
The screen should automatically be turned off after 10 seconds without key press. This should only apply to the main channel display mode, not in either scan mode or during configuration.
The feature should be optional and the factory setting should be OFF
The background for the improvement is to be able to mount the display inside the visor.
Hello, Is it possible to add the L Channels for the band ??
The click type timing is very sensitive. It is especially hard to issue a proper double click. There is a huge potential for improvement in this area.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.