diff --git a/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 b/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 index 3851aa5..f28a6b9 100644 --- a/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 +++ b/.jekyll-cache/Jekyll/Cache/Jekyll--Cache/b7/9606fb3afea5bd1609ed40b622142f1c98125abcfe89a76a661b0e8e343910 @@ -1 +1 @@ -I"a{"source"=>"/media/user/Storage-Fast/Research/code/github-website/src", "destination"=>"/media/user/Storage-Fast/Research/code/github-website/src/_site", "collections_dir"=>"collections", "cache_dir"=>".jekyll-cache", "plugins_dir"=>"_plugins", "layouts_dir"=>"_layouts", "data_dir"=>"_data", "includes_dir"=>"_includes", "collections"=>{"posts"=>{"output"=>true, "permalink"=>"/:categories/:year/:month/:day/:title:output_ext"}, "projects"=>{"output"=>true}, "blog"=>{"output"=>true}}, "safe"=>false, "include"=>[".htaccess"], "exclude"=>[".sass-cache", ".jekyll-cache", "gemfiles", "Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"], "keep_files"=>[".git", ".svn"], "encoding"=>"utf-8", "markdown_ext"=>"markdown,mkdown,mkdn,mkd,md", "strict_front_matter"=>false, "show_drafts"=>nil, "limit_posts"=>0, "future"=>false, "unpublished"=>false, "whitelist"=>[], "plugins"=>["jekyll-feed", "jekyll-seo-tag", "jekyll-paginate"], "markdown"=>"kramdown", "highlighter"=>"rouge", "lsi"=>false, "excerpt_separator"=>"\n\n", "incremental"=>false, "detach"=>false, "port"=>"4000", "host"=>"127.0.0.1", "baseurl"=>nil, "show_dir_listing"=>false, "permalink"=>"date", "paginate_path"=>"/page:num/", "timezone"=>nil, "quiet"=>false, "verbose"=>false, "defaults"=>[], "liquid"=>{"error_mode"=>"warn", "strict_filters"=>false, "strict_variables"=>false}, "kramdown"=>{"auto_ids"=>true, "toc_levels"=>[1, 2, 3, 4, 5, 6], "entity_output"=>"as_char", "smart_quotes"=>"lsquo,rsquo,ldquo,rdquo", "input"=>"GFM", "hard_wrap"=>false, "guess_lang"=>true, "footnote_nr"=>1, "show_warnings"=>false, "syntax_highlighter"=>"rouge", "syntax_highlighter_opts"=>{:default_lang=>"plaintext", :guess_lang=>true}, "coderay"=>{}}, "title"=>"RCmags", "author"=>"Mags", "email"=>"memoryofatrufestival@gmail.com", "description"=>"Projects and other things", "paginate"=>6, "github_username"=>"RCmags", "youtube_username"=>"XXXmags", "rcgroups_username_id"=>"189488", "google_analytics"=>true, "minima"=>{"date_format"=>"%-d %b, %Y"}, "livereload_port"=>35729, "serving"=>true, "watch"=>true, "url"=>"http://localhost:4000"}:ET \ No newline at end of file +I"ç{"source"=>"/media/user/Storage-Fast/Research/code/github-website/src", "destination"=>"/media/user/Storage-Fast/Research/code/github-website/src/_site", "collections_dir"=>"collections", "cache_dir"=>".jekyll-cache", "plugins_dir"=>"_plugins", "layouts_dir"=>"_layouts", "data_dir"=>"_data", "includes_dir"=>"_includes", "collections"=>{"posts"=>{"output"=>true, "permalink"=>"/:categories/:year/:month/:day/:title:output_ext"}, "projects"=>{"output"=>true}, "blog"=>{"output"=>true}}, "safe"=>false, "include"=>[".htaccess"], "exclude"=>[".sass-cache", ".jekyll-cache", "gemfiles", "Gemfile", "Gemfile.lock", "node_modules", "vendor/bundle/", "vendor/cache/", "vendor/gems/", "vendor/ruby/"], "keep_files"=>[".git", ".svn"], "encoding"=>"utf-8", "markdown_ext"=>"markdown,mkdown,mkdn,mkd,md", "strict_front_matter"=>false, "show_drafts"=>nil, "limit_posts"=>0, "future"=>false, "unpublished"=>false, "whitelist"=>[], "plugins"=>["jekyll-feed", "jekyll-seo-tag", "jekyll-paginate"], "markdown"=>"kramdown", "highlighter"=>"rouge", "lsi"=>false, "excerpt_separator"=>"\n\n", "incremental"=>false, "detach"=>false, "port"=>"4000", "host"=>"127.0.0.1", "baseurl"=>nil, "show_dir_listing"=>false, "permalink"=>"date", "paginate_path"=>"/page:num/", "timezone"=>nil, "quiet"=>false, "verbose"=>false, "defaults"=>[], "liquid"=>{"error_mode"=>"warn", "strict_filters"=>false, "strict_variables"=>false}, "kramdown"=>{"auto_ids"=>true, "toc_levels"=>[1, 2, 3, 4, 5, 6], "entity_output"=>"as_char", "smart_quotes"=>"lsquo,rsquo,ldquo,rdquo", "input"=>"GFM", "hard_wrap"=>false, "guess_lang"=>true, "footnote_nr"=>1, "show_warnings"=>false}, "title"=>"RCmags", "author"=>"Mags", "email"=>"memoryofatrufestival@gmail.com", "description"=>"Projects and other things", "paginate"=>6, "github_username"=>"RCmags", "youtube_username"=>"XXXmags", "rcgroups_username_id"=>"189488", "google_analytics"=>true, "minima"=>{"date_format"=>"%-d %b, %Y"}, "livereload_port"=>35729, "serving"=>true, "watch"=>true, "url"=>"http://localhost:4000"}:ET \ No newline at end of file diff --git a/_collections/_blog/computers.md b/_collections/_blog/computers.md deleted file mode 100755 index 4a4252b..0000000 --- a/_collections/_blog/computers.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Computers -description: "Miscellaneous articles and projects involving PC hardware" ---- diff --git a/_collections/_blog/research.md b/_collections/_blog/research.md deleted file mode 100755 index 3816498..0000000 --- a/_collections/_blog/research.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Research -description: "Record of experiences and milestones during graduate school" ---- diff --git a/_collections/_blog/travel.md b/_collections/_blog/travel.md deleted file mode 100755 index ffd4f58..0000000 --- a/_collections/_blog/travel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Travel -description: "Analyses and descriptions about places and journeys" ---- diff --git a/_collections/_projects/aircraft.md b/_collections/_projects/aircraft.md deleted file mode 100755 index 3463f07..0000000 --- a/_collections/_projects/aircraft.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Aircraft -description: "Model aircraft and other flying devices" ---- diff --git a/_collections/_projects/airplanes.md b/_collections/_projects/airplanes.md deleted file mode 100755 index eb653db..0000000 --- a/_collections/_projects/airplanes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Airplanes -description: "Models of aircraft with fixed wings and tails" ---- diff --git a/_collections/_projects/arduino-libraries.md b/_collections/_projects/arduino-libraries.md deleted file mode 100755 index df816db..0000000 --- a/_collections/_projects/arduino-libraries.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: "Arduino Libraries" -description: "Libraries and code for the Arduino development boards" ---- diff --git a/_collections/_projects/autogyros.md b/_collections/_projects/autogyros.md deleted file mode 100755 index 0eab1ee..0000000 --- a/_collections/_projects/autogyros.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Autogyros -description: "Models of Autogyros with passively rotated rotors" ---- diff --git a/_collections/_projects/garrys-mod.md b/_collections/_projects/garrys-mod.md deleted file mode 100755 index 5b4ecf9..0000000 --- a/_collections/_projects/garrys-mod.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: "Garry's mod" -description: "Designs, concepts and tutorials for the sandbox game Garry's mod" ---- diff --git a/_collections/_projects/helicopters.md b/_collections/_projects/helicopters.md deleted file mode 100755 index 5bd7024..0000000 --- a/_collections/_projects/helicopters.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Helicopters -description: "Aircraft with a powered rotor" ---- diff --git a/_collections/_projects/miscellaneous.md b/_collections/_projects/miscellaneous.md deleted file mode 100755 index 728bfb9..0000000 --- a/_collections/_projects/miscellaneous.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Miscellaneous -description: "Other random projects" ---- diff --git a/_collections/_projects/ornithopters.md b/_collections/_projects/ornithopters.md deleted file mode 100755 index bd708cd..0000000 --- a/_collections/_projects/ornithopters.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Ornithopters -description: "Model aircraft powered by flapping wings" ---- diff --git a/_collections/_projects/robots.md b/_collections/_projects/robots.md deleted file mode 100755 index 33b7eae..0000000 --- a/_collections/_projects/robots.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: Robots -description: "Small robots and other electro-mechanical prototypes" ---- diff --git a/_collections/_projects/tail-less-airplanes.md b/_collections/_projects/tail-less-airplanes.md deleted file mode 100755 index 2555fa8..0000000 --- a/_collections/_projects/tail-less-airplanes.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: "Tail-less Airplanes" -description: "Model airplanes that do not depend on a tail for stability" ---- diff --git a/_collections/_projects/weight-shift-helicopters.md b/_collections/_projects/weight-shift-helicopters.md deleted file mode 100755 index 8f24d18..0000000 --- a/_collections/_projects/weight-shift-helicopters.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: category-page -category: "Weight Shift Helicopters" -description: "Model helicopters with one or two rotors" ---- diff --git a/_collections/blog/Computers/_posts/2024-06-16-laptop-ups.md b/_collections/blog/Computers/_posts/2024-06-16-laptop-ups.md deleted file mode 100755 index 529083f..0000000 --- a/_collections/blog/Computers/_posts/2024-06-16-laptop-ups.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -layout: post -title: "DIY Laptop powerbank / Battery power supply" - -slider1: -- url: /img/laptop-ups/complete/ups-0.jpg -- url: /img/laptop-ups/complete/ups-1.jpg -- url: /img/laptop-ups/complete/ups-2.jpg -- url: /img/laptop-ups/complete/ups-3.jpg -- url: /img/laptop-ups/complete/ups-4.jpg -- url: /img/laptop-ups/complete/ups-5.jpg -- url: /img/laptop-ups/complete/ups-6.jpg -- url: /img/laptop-ups/complete/ups-6b.jpg -- url: /img/laptop-ups/complete/ups-7.jpg -- url: /img/laptop-ups/complete/ups-8.jpg - ---- - -Sometimes it’s fun to try different projects just to see if you can pull them off. One such project was creating a battery backup for a laptop. At first, this might seem unnecessary since laptops already have batteries. However, there are situations where the battery's capacity might be insufficient, it might not work, or replacing it could be too challenging. In these cases, you can run the laptop without AC power by mimicking the power supplied by an AC adapter using a battery. - -Batteries and AC power supplies are quite different. Batteries have variable voltage and need a charging circuit. Additionally, the battery must be the right size to power the laptop for a reasonable time. While this might sound complicated, the project itself is manageable. Here's an example of a power bank made by [GreatScott!](https://www.youtube.com/@greatscottlab): - -{% include youtube.html id='ZQjazsiyr8s' %} -

Video 1. DIY Laptop Power Bank

- -You can create something similar with a few inexpensive components. Here’s what you’ll need: - -- **A Large Capacity Battery**: You can use any rechargeable battery that safely outputs the required power for the laptop. Options include inexpensive lead-acid batteries or better-performing lithium-ion batteries. For this project, we’ll use a 12V 3S Lithium-Ion pack made of multiple 18650 cells. - -![image](/img/laptop-ups/parts/battery.jpeg) - -- **DC-to-DC Step-Down Converter**: This component acts as the charging module for the UPS. By setting its maximum current and voltage output, it can charge various batteries. The input voltage to this module MUST be higher than the battery’s charge voltage. However, the maximum current will be limited to what’s safe for the battery and the power output of the voltage input source. - -![image](/img/laptop-ups/parts/step-down.jpg) - -- **An AC-to-DC Power Converter**: A typical 65W laptop charger works well. It usually has a __20V__ output and a maximum current of __3.25A__. You can use any similar converter as long as its voltage is higher than the fully charged battery voltage and its power exceeds the laptop's requirements plus the step-down converter. - -![image](/img/laptop-ups/parts/ac-charger.jpg) - -- **DC-to-DC Step-Up Converter**: Since the battery voltage varies with capacity and instantaneous load, you need a module to regulate this variable voltage into a steady output. Given that the battery voltage is always lower than the required load voltage (20V for the laptop), the step-up converter will increase the battery voltage. - -![image](/img/laptop-ups/parts/step-up.jpg) - -- **Communication Module or Relay**: The UPS needs to switch between charging and discharging the battery. A relay switch that activates with the AC current and connects the battery to the step-down converter/charger is a simple solution. - -![image](/img/laptop-ups/parts/relay.jpg) - -With these components, you can build a system that automatically switches between AC and DC power. If AC power fails, the relay will quickly switch to battery power. However, because the relay is mechanical, it takes a short time to change states. This brief delay will cause the laptop to briefly rely on its internal battery while the UPS transitions, resulting in an __interrupted power supply__. Despite this drawback, relays have some advantages: - -1. Relays have very low contact resistance because they’re mechanical switches. The voltage drop across them is minimal, whether the coil is powered or not. - -2. There is minimal heat loss in an unpowered relay due to its low contact resistance. - -In contrast, other switching methods like transistors or diodes generate more heat when current flows through them. However, they have instant switching times compared to mechanical switches. - -Combining these components, you can assemble the system as shown in the diagram below: - -![image](/img/laptop-ups/laptop-ups.png) -

Schematic of UPS Circuit

- -The overall system is quite simple. It essentially serves as a pass-through for the AC-to-DC converter and an automatic charger for the battery. The __input voltage__ from the AC-DC converter only needs to be __higher__ than the __battery voltage__. It does NOT need to match the voltage required by the laptop. Thus, a ~12V to ~20V converter can be used with this design, offering flexibility in input voltage. - -{% include image-slider.html list=page.slider1 %} -

Views of the Completed Direct-Current UPS

- -As the images show, the completed UPS is compact and functional. It can be completely turned off by unplugging the AC-DC power supply and disconnecting the battery via the power switch. Adding a handle to the device makes it easy to move around. Overall, this was a relatively simple project that proved useful in off-grid situations. With a 4th-generation Intel laptop drawing around 10W to 40W, I was able to keep it running for over **16 hours**. Quite an achievement for some inexpensive modules wired together! diff --git a/_collections/blog/Computers/_posts/2024-08-13-remarks-old-laptops.md b/_collections/blog/Computers/_posts/2024-08-13-remarks-old-laptops.md deleted file mode 100755 index 5c7e395..0000000 --- a/_collections/blog/Computers/_posts/2024-08-13-remarks-old-laptops.md +++ /dev/null @@ -1,42 +0,0 @@ ---- - -layout: post -title: "Remarks on Slow Laptops and Low-Performance Computers" - -slider1: -- url: /img/laptop-ups/complete/ups-0.jpg - ---- - -For several years, I had the misfortune of using a very slow laptop without knowing any better. What do I mean by this? One of the challenges with computers, from a user standpoint, is that performance is relative. You perceive something as "fast" if it operates within a timeframe you deem acceptable. For instance, in 1995, rendering a relatively simple 3D image of a landscape could take hours. - -![image](https://i.pcmag.com/imagery/lineups/03osSl1r3F5I1dhTDdpMJDO-1.fit_lim.size_768x432.v1569492816.jpg) -

Some 90s-style image

- -By comparison, almost any commercial device in 2024 can recreate that image in much less time. Despite this tremendous increase in computing power, for people in 1995, their equipment seemed relatively quick based on their expectations. The same effect can occur if you're not exposed to something you can qualify as "better." In my case, this lack of perception developed gradually through using a very slow fanless laptop from HP. Specifically, the [HP 15-f223wm](https://support.hp.com/us-en/product/product-specs/hp-15-f200-notebook-pc-series/model/8857447): - -![image](https://shop.usapawn.com/files/inventory/ebay/1545226/1643212257-lg.jpg) - -It featured a modest [Celeron N3050](https://ark.intel.com/content/www/us/en/ark/products/87257/intel-celeron-processor-n3050-2m-cache-up-to-2-16-ghz.html) processor, 4GB of single-channel RAM, and a 500GB 5200 RPM hard drive. For 2005, the performance of this device would have been noteworthy, especially considering its size and the **very low** power consumption of the processor (only **6W** TDP). In that era, a similar processor would easily consume **110W**. For example, the [AMD Opteron 170](https://www.cpu-upgrade.com/CPUs/AMD/Dual-Core_Opteron/170.html): - -![image](https://c1.neweggimages.com/ProductImage/19-103-585-01.jpg) - -There's a tremendous difference in power draw for similar computational power. The Celeron (with 14nm lithography) was released in 2015, while the Opteron (90nm lithography) came out in 2005, and the reduction in power consumption is significant. This decrease is due to the thinner layers in processors, which result in much less heat. - -Technical details aside, I used this laptop for years until I couldn’t tolerate its slowness any longer. In retrospect, struggling with this device wasn't entirely a bad idea. It taught me how to squeeze out performance from limited hardware and demonstrated the impact **lightweight** software has on user experience. It also highlighted the benefits of **optimizing** software, even if it's easy to run. Both adjustments greatly enhance the perceived performance of a device. However, no matter how optimized the software, if the task is too computationally intensive, the machine will slow down. While optimization has its place, hardware ultimately limits the tasks one can comfortably perform. - -The HP laptop came with [Windows 10 Home 2016 Edition](https://pureinfotech.com/windows-10-pro-vs-home-which-you-should-buy/). Initially, this version of Windows didn’t feel completely sluggish. What was evident, however, was the aggressive behavior of the antivirus. Windows Defender constantly saturated the processor, doing who-knows-what, and it would randomly slow down the computer. - -![image](https://skyeybureau.weebly.com/uploads/1/2/4/3/124340256/348029392.png) - -After a few years of dealing with this, I switched to Linux, specifically the lightweight version of Ubuntu using the LXQt desktop environment: [Lubuntu](https://lubuntu.me/). The change was remarkable. Despite still using the very slow hardware, compared to an unbloated version of Windows 10 Home, the computer felt much faster. While many programs, like web browsers, didn’t run significantly better, the operating system itself didn’t cause the computer to slow down. There was no antivirus causing massive slowdowns! - -After about six months, I decided to make the best upgrade possible for such a device: switching from a [mechanical hard drive](https://en.wikipedia.org/wiki/Hard_disk_drive) to a [SATA solid-state drive](https://en.wikipedia.org/wiki/Solid-state_drive). The improvement was incredible. The computer ran much faster with this switch. Programs loaded quickly, boot time was significantly reduced (taking seconds instead of minutes), and the software manager in Lubuntu loaded in seconds rather than hanging up. Overall, this was an excellent upgrade, and I regret not doing it earlier. - -![image](https://basic-tutorials.de/wp-content/uploads/2020/10/bigstock-SSD-state-solid-drives-disk-on-311822974.jpg) - -Seeing the benefits of hardware upgrades, I also increased the RAM from **4GB to 8GB**. In practice, this didn’t seem to make a huge difference, but having maxed out this parameter felt appropriate. Over time, I appreciated the greater stability this added when using multiple tabs in a browser or having several programs open. - -I had learned the importance of critical upgrades, both in hardware and software, that transformed a nearly unusable computer into a useful tool. Although the laptop still had limitations—mainly that any modest program would quickly saturate the processor—the experience was much improved. At this point, with all possible upgrades performed, the main focus became **lightweight software** and **optimizing** it. For example, [tuning optimization flags](https://github.com/TrueHerobrine/trues-chromium-optimizations) for [ungoogled Chromium](https://github.com/ungoogled-software/ungoogled-chromium) is one such optimization. - -The key takeaway from these reflections is that seemingly underpowered computers, when given the right hardware upgrades and appropriate software selection, can go from near-useless devices to valuable everyday tools. The equipment just needs to be fast enough to meet the **subjective** speed requirements of the user. Beyond that, additional computational power yields minimal gains. The equipment should be optimized for the user’s needs, and old and _apparently_ slow hardware can _definitely satisfy_ many use cases. diff --git a/_collections/blog/Research/_posts/2024-06-06-machine-learning.md b/_collections/blog/Research/_posts/2024-06-06-machine-learning.md deleted file mode 100755 index 37a1147..0000000 --- a/_collections/blog/Research/_posts/2024-06-06-machine-learning.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -layout: post -title: "Initial foray into machine learning" ---- - -As of __2024__ the topic of [artificial intelligence](https://hbr.org/2023/06/the-ai-hype-cycle-is-distracting-companies) as blown up and become widely popular. While it is purported as a revolutionary set of technologies that will change the the future of humanity, to a more critical eye such arguments come off as marketing for businesses. Hype aside, the technologies themselves look quite intriguing if nothing else for their novelty. There some also some examples of artificial intelligence that are just too cool to ignore. Here's an example: - -{% include youtube.html id='kojH8a7BW04' %} -

This is an amazing video isn't it?

- -It goes without saying that the above video is an amazing culmination of [Yosh's](https://www.youtube.com/@yoshtm) work. It's also highly inspiration. These results were apparently obtained by just running some code through a personal computer for a long time. Based on the hype about AI, it gives the impression that one needs very potent computers to teach the AI's to do anything useful. But if a simple PC can generate what are demonstrably good results, then it's very reassuring that the layman can learn about these technologies on a budget. - -![image](https://media.istockphoto.com/photos/homeless-man-on-laptop-sitting-in-a-junkyard-having-fun-picture-id176133457?k=20&m=176133457&s=612x612&w=0&h=MuBhGm7qQYhcRfO79hT3PrlVKw_5PoO88yvx_kyelNg=) - -Thankfully, the area of AI has existed for a long time so there is a vast amount of open-source software to learn about it. A great example of this accesibility are free courses like __FreeCodeCamps's__ [Machine Learning with Python Certificate](https://www.freecodecamp.org/learn/machine-learning-with-python/). I admit, I was amazed when I saw this when I looking for tutorials on web development. It was just _there_ and found difficult to _not_ go through the course out of sheer curiosity. - -Once you dive into this world you soon discover even more free resources to learn about AI. There's even free _textbooks_ about the stuff. Here's some that caught the attention of my untrained eye: - -- [Learn Pytorch](https://www.learnpytorch.io/00_pytorch_fundamentals/) _Zero to Mastery Learn PyTorch for Deep Learning_ - -- [Practical Deep Learning](https://course.fast.ai/) _A free course designed for people with some coding experience, who want to learn how to apply deep learning and machine learning to practical problems._ - -If we keep going there's a ocean of _paid_ courses on AI available at websites like [Coursera](https://www.coursera.org/search?query=machine%20learning). Now that impressive! - -Still, keeping with the spirit of this blog that is hosted on [github pages](https://pages.github.com/) and written on old Thinkpad running [Xubuntu](https://xubuntu.org/download/), I think its best to stick with the non-paid courses (for now). There's no need to pay for education on topics one may-or-may-not end up liking and just don't mesh with intellectually. Anyone that has churned-out a college degree can attest to this. diff --git a/_collections/blog/Research/_posts/2024-06-08-machine-learning-1.md b/_collections/blog/Research/_posts/2024-06-08-machine-learning-1.md deleted file mode 100755 index c2bea31..0000000 --- a/_collections/blog/Research/_posts/2024-06-08-machine-learning-1.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -layout: post -title: "Machine learning frameworks | A newbie perspective" ---- - -The first time I dabbled with machine learning was during college for a undergraduate reasearch assignment. The task was to update some code written in [Python](https://www.python.org/) and [Julia](https://julialang.org/). The code involved algorithms used for aircraft traffic control, and due to the complexity of preventing multiple aircraft from crashing into each other, machine learning was used to obtain a solution that would otherwise be much harder to find manually. - -![image](https://www.mdpi.com/symmetry/symmetry-12-00985/article_deploy/html/images/symmetry-12-00985-g001-550.jpg) - -This project introduced me to some of the frameworks of that are used for ML. The python scripts used [Tensorflow 1.x](https://www.tensorflow.org/) and the Julia scripts used a mixture of [DeepRL](https://github.com/mkschleg/DeepRL.jl), [DeepQLearning](https://github.com/JuliaPOMDP/DeepQLearning.jl), [JuliaML](https://github.com/JuliaML), [Flux](https://fluxml.ai/Flux.jl/stable/), and probably some other stuff I've forgotten. At the time I didn't understand any of these libraries and even less how they worked, so I completely failed to fix the code. I also felt ML was a bit of a fad and wasn't interested in getting caught up in a short-lived wave of popularity. - -With time it made sense it wasn't just a fad and that learning about ML would be positive (especially as the last time I encountered it I was completely dumbfounded). After stumbling upon __FreeCodeCamps's__ [Machine Learning with Python](https://www.freecodecamp.org/learn/machine-learning-with-python/) and completing the course (which involved multiple choice questions, there are no code exercise unfortunately), I vaguely understood that there were a few popular python frameworks for ML. Some of these include: - -- [Tensorflow](https://www.tensorflow.org/): _An end-to-end open source machine learning platform for everyone._ -- [Keras](https://keras.io/): _Keras is an API designed for human beings, not machines._ -- [Pytorch](https://pytorch.org/): _PyTorch is a fully featured framework for building deep learning models._ -
- -The course focused on Keras (despite claiming its focused on tensorflow), which is a layer that goes atop another package that actually handles the ML algorithms. The default back-end is Tensorflow but you can also use __Pytorch__. Unfortunately, I recall my experience with Tensorflow and it wasn't the best one. While I didn't understand the library the code felt confusing and read like a convoluted mess. Objects upon object upon nested objects. By comparison, Pytorch's code seems a lot less dependant on special objects and uses more of Python's basic building blocks. Pytorch feel more... [Pythonic](https://builtin.com/data-science/pythonic)?. - -![image](/img/machine-learning/framworks.jpg) - -For a beginner this familiarity feels a lot simpler and easier to understand. A more tecnical comparison between the two libraries can be found here: [Pytorch vs Tensorflow](https://realpython.com/pytorch-vs-tensorflow/). Instead of using Python it's also possible to use Julia but its ecosystems seem smaller and less newbie friendly than their python equivalents. The [pre-compiled](https://julialang.github.io/PrecompileTools.jl/stable/) nature of Julia can benefit re-running code, but that's an optimization thats irrelevant for a student learning through small projects. As a beginner, it makes more sense to stick to what's popular due to the plethora of answered questions that can be found online. diff --git a/_collections/blog/Travel/_posts/2023-05-01-windy-flight.md b/_collections/blog/Travel/_posts/2023-05-01-windy-flight.md deleted file mode 100755 index 0083c22..0000000 --- a/_collections/blog/Travel/_posts/2023-05-01-windy-flight.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -layout: post -title: "Flying on a windy day - slope 'soaring' in a scenic valley" - -# image sliders: -slider1: -- url: /img/aerobird/slope-flight/DSC_0018-res.JPG -- url: /img/aerobird/slope-flight/DSC_0017-res.JPG -- url: /img/aerobird/slope-flight/DSC_0016-res.JPG -- url: /img/aerobird/slope-flight/DSC_0012-res.JPG -- url: /img/aerobird/slope-flight/DSC_0009-res.JPG - -slider2: -- url: /img/aerobird/slope-flight/DSC_0030-res.JPG -- url: /img/aerobird/slope-flight/DSC_0033-res.JPG -- url: /img/aerobird/slope-flight/DSC_0035-res.JPG ---- - -For a long time I've wanted to fly an [Aerobird Challenger](https://www.horizonhobby.com/product/aerobird-challenger-rtf-electric/HBZ3500.html) on a windy hill to get some ridge lift. This is an old airplane with slow servos and horrible tip stalls, so it's obviously an adequate platform. Nonetheless, not being one swayed by such minor details, I've had this fascination with flying the model through some scenic mountains. - -I tried this before and it ended about as one would expect. All seemed well at first when the model flew into the wind, but as soon as it turned, down went a wing and I walked away with a pipe of scrap. Well, at least it hit some pavement to really cement itself as a straight flyer _(hahaha, what a great joke)_. Having not learned my lesson, I gave it another try, but this time I came "prepared". What this really meant was giving the wing some [washout](https://en.wikipedia.org/wiki/Washout_(aeronautics)) and hoping that it would eliminate the tip stalls. Much to my surprise _it did_ (at least with little wind), so I went back to the mountains with as much confidence as a chicken running across water. - -{% include image-slider.html list=page.slider1 aspect_ratio="16/9" %} -

Super pretty mountains, no?

- -Needless to say, the slope I chose as my site of sacrifice was pretty windy, but it was also a fairly steady wind. The best way I can describe it is like being in front of a very smooth fan. Since I was atop a big-ass mountain, I spent a few seconds preparing myself mentally to have to walk a few kilometers down a gulch to pick this thing up. With less courage than before, I strapped the aerobird together with some rubber hands, held my transmitter close, and threw it into the air: - -{% include youtube.html id='BOzrmk3ns_M' %} -

It flew! and quite straight at that!

- -The flight was interesting to say the least. For one, the model didn't crash, which was a major success, and my palms weren't too sweaty after it landed. The washout definately did its job and eliminated the death-inducing tip stalls. This was essential as without this degree of stability, the aircraft would have flipped over given how aggressively the wind was causing it to bank. - -It was an exhilarating flight but I wouldn't call it enjoyable. Fulfilling, yes! But enjoyable? Not really. It was stressful as it felt that even a small mistake would let the airplane fly off in the distance and suddenly enter an unrecoverable dive. Moreover, the wind wasn't really keeping the model aloft. It still needed a small amount of throttle to maintain altitude so it wasn't really soaring. I'll definitely try this again but in calmer conditions with a stronger updraft. - -{% include image-slider.html list=page.slider2 aspect_ratio="16/9" %} -

The sunset was really nice on the way back

diff --git a/_collections/blog/Travel/_posts/2024-06-04-hawkmoth.md b/_collections/blog/Travel/_posts/2024-06-04-hawkmoth.md deleted file mode 100755 index 85d23d0..0000000 --- a/_collections/blog/Travel/_posts/2024-06-04-hawkmoth.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -layout: post -title: "Hawkmoths from the mountains" - -slider1: -- url: /img/hawkmoth/view/hawkmoth-1.jpg -- url: /img/hawkmoth/view/hawkmoth-2.jpg - -slider2: -- url: /img/hawkmoth/body/body-0.jpg -- url: /img/hawkmoth/body/body-1.JPG - -slider3: -- url: /img/hawkmoth/nocturnal/dark-1.JPG -- url: /img/hawkmoth/nocturnal/dark-2.JPG -- url: /img/hawkmoth/nocturnal/dark-3.JPG ---- - -One of the neat things about living in a warm climate is an abundance of insects. While most of them are small -some can grow to appreciable sizes from the perspective of a human. One of my favorite group of insects are the family of [Sphingidae](https://en.wikipedia.org/wiki/Sphingidae) or _Hawkmoths_. These are large and heavy months that drink sweet water like a butterfly. - -{% include image-slider.html list=page.slider1 %} -

The most common hawkmoth I've encountered

- -In terms of size, their bodies are around 20cm in length and weight somewhere close to 3 grams. Some of them can grow larger but whatever their size it's quite easy to notice their heft when one picks them up. Despite their big size they're quite fragile. Their legs are toothpick thin and easily broken if not handled with care. It's to the degree that I've witnessed these insects rip off their own legs if grabbed incorrectly. They don't seem to mind, but its not the best way to treat these critters. - -{% include image-slider.html list=page.slider2 %} -

Very fragile legs and large wings

- -Of the variety of Hawkmoths that I've come across, all of them overwhelmingly fly during dusk or night, and completely "turn off" during the day. They appear to be very sensitive to light and will go still at night if they're inside a well lit room, yet the moment the lights turn off, they will burst into life and start flying. - -{% include image-slider.html list=page.slider3 %} -

The moths wake up when it's dark

- -Perhaps the most fascinating aspect of these animals is how they fly. It's very elegant and combines the fluttering grace of a butterfly with the helicopter-like robotic movements of a fly. Moreover, since they're so big, it's quite easy to watch them in detail. Their wings don't flap that quickly either. One time I recorded the sound of their wing-beat and it measured at approximately 25hz. It's slow enough that their wings don't appear as a translucent blur as they move, but rather they will flicker as they flap. - -{% include youtube.html id='_ECipm4IzfQ' %} -

Video 1. Slow motion hawkmoth

- -Since they're nocturnal it's hard to feed them while they're flying. The easiest thing is to feed them on the ground while they're half-asleep. Sometimes if you put some sugar-water in-front of them they will "wake up" and start drinking it, but a lot of the time you have to place their [proboscis](https://en.wikipedia.org/wiki/Proboscis) directly on-top of the food to them to drink. A toothpick works well to uncoil their mouth-parts and drag into the food. - -{% include youtube.html id='FKhzFmLDmUc' %} -

Video 2. A moth that flew into my house

- -[Bart Coppen's](https://www.youtube.com/@BartCoppens) tutorial on how to feed a moth is a great guide on how to do this: - -{% include youtube.html id='z7ZHGpjoSvw' %} -

Video 3. How to feed a moth (with a toothpick)!

- -Overall, these are fascinating animals and are well worthy studying! Some of them can be very colorful. Their colors are not as vibrant as those of butterflies and are more matte toned, but they're very beautiful nonetheless. They can also fly very fast if you can watch them during the daytime! diff --git a/_collections/note.txt b/_collections/note.txt deleted file mode 100755 index 06505b0..0000000 --- a/_collections/note.txt +++ /dev/null @@ -1 +0,0 @@ -Note: Use a collection to organize multiple posts for a project diff --git a/_collections/projects/Arduino Libraries/_posts/2019-10-16-diy_servo.md b/_collections/projects/Arduino Libraries/_posts/2019-10-16-diy_servo.md deleted file mode 100755 index be38f7b..0000000 --- a/_collections/projects/Arduino Libraries/_posts/2019-10-16-diy_servo.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -layout: post -title: "Custom servo motor using a DC motor, H-bridge, and an analog sensor" ---- - -The purpose of this library is to create a custom servo motor. To use it you will need: - -- An H-bridge -- A DC motor that can be reversed by flipping the voltage across it. -- An analog sensor that can measure the position of the motor. - -You will also need a single analog pin and two pins capable of pwm output. See this page -to find out what pwm pins are available on your [arduino board](https://www.arduino.cc/reference/en/language/functions/analog-io/analogwrite/) - -Each of the components must be connected in the following way: - -- The motor leads connect to the H-bridge. -- The H-bridge input pins are connected to the chosen pwm pins of the arduino. -- The sensor is connected to the chosen analog pin of the arduino. - -Note that the library uses analogRead() to measure the sensor. As such, the entire range -of motion will be divided to 1024 individual steps. For a 180 degree rotation this means -a maximum precision of 180/1024 ~ 0.18 degrees. - -The motion of the servo is controlled via a PID loop. The associated coefficients are set -when a sketch is compiled and cannot be changed once the arduino is running. - -Credit goes to Pavel Holoborodko for the coefficients used to calculate the PID -derivatives. See this page for his work on [noise robust differentiators](http://www.holoborodko.com/pavel/numerical-methods/numerical-derivative/smooth-low-noise-differentiators/) - -Finally, the methods of the class are: - -- initialize(): sets the input and output pins and calibrates the servo. -- readSensor(): returns the unfiltered sensor signal. -- setPosition(int): sets the target position of the servo. - -The schematic below provides an example for the required conections: - -![image](https://raw.githubusercontent.com/RCmags/ServoMotor/master/DIY_servo_schem.png) - -Here's a video of hobby servo using this software: - -{% include youtube.html id='FxEQQvTA3Fk' %} - -### Github Repo: -[ServoMotor](https://github.com/RCmags/ServoMotor) diff --git a/_collections/projects/Arduino Libraries/_posts/2020-03-14-imu_sensor_fusion.md b/_collections/projects/Arduino Libraries/_posts/2020-03-14-imu_sensor_fusion.md deleted file mode 100755 index 7d0040f..0000000 --- a/_collections/projects/Arduino Libraries/_posts/2020-03-14-imu_sensor_fusion.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -layout: post -title: "Sensor fusion algorithm for an IMU based on a quaternion" ---- - -This library contains a sensor fusion algorithm to combine the outputs of a 6-axis inertial measurement unit (IMU). It's based on a modified version of the Mahony filter that replaces the PI controller with something akin to a 2nd order low pass filter. The proportional term was removed and the integral term has been forced to decay in order to damp the system. The correction steps of each filter are shown below: - -- Mahony: -_integral += error.dt -dtheta = theta_dot.dt + kp.error + ki.integral_ - -- Modified Mahony: -_integral += error.kp - integral.kc -dtheta = theta_dot.dt + integral_ - -The behavior of the modified filter is analogous to spring-mass system. Kp (stiffness) and Kc (damping) are related by the damping ratio Q which is held constant. This allows the behavior of the filter to be controlled via a single parameter. - -The filter uses a quaternion to encode rotations. This makes it easy to perform coordinate transformations. These include: -- Transfor a vector from the local frame to the global (and vice versa) -- Get unit vectors of the X, Y and Z axes in the local or global frame. - -Since a 6-axis IMU has no absolute reference for heading there is a function to rotate the orientation estimate about the yaw axis. Basic vector operations have been included to easily implement a heading correction algorithm should one have an additional sensor (such a magnetometer or some other absolute heading sensor). - -For more information on the Mahony filter see these links: -- [IMU Data Fusing: Complementary, Kalman, and Mahony Filter](http://www.olliw.eu/2013/imu-data-fusing/#chapter23) -- [Mahony Filter](https://nitinjsanket.github.io/tutorials/attitudeest/mahony) - -### Github Repo: -[imuFilter](https://github.com/RCmags/imuFilter) diff --git a/_collections/projects/Arduino Libraries/_posts/2020-07-11-mpu6050.md b/_collections/projects/Arduino Libraries/_posts/2020-07-11-mpu6050.md deleted file mode 100755 index f104f75..0000000 --- a/_collections/projects/Arduino Libraries/_posts/2020-07-11-mpu6050.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -layout: post -title: "Basic interface for the MPU-6050 6-axis IMU (gyro/accelerometer)" ---- - -The purpose of this library is to make a basic and lightweight interface for the MPU6050. It can do the following: -- Configure the inbuilt low pass filter -- Configure the sensitivity of the accelerometer and gyro -- Retrieve the raw output of the sensor -- Output scaled accelerometer and gyro values - -The library includes two functions to calibrate the gyro and remove bias. The first is intended to be called when the sensor is turned on and is not moving. It takes a long term average of the output of each axis and subtracts these values from the raw signals. - -The second function is designed to update the averages. It updates the values with a moving average and the gain is controlled by something akin to a kalman filter. By polling this function one can correct for drift in the gyro bias. By combining these two functions one can obtain stable and consistent gyro outputs. However, The accelerometer needs to calibrated manually by correcting the bias and scale. - -Finally, the library was written for a single MPU6050 connected to a MEGA board as follows. It may require some modifications to work succesfully on other boards: - -![image](https://raw.githubusercontent.com/RCmags/basicMPU6050/main/extras/mega_schematic.png) - -See this link for the information on the registers of the MPU6050: -[MPU 6050 register map](https://invensense.tdk.com/wp-content/uploads/2015/02/MPU-6000-Register-Map1.pdf) - -### Github Repo: -[basicMPU6050](https://github.com/RCmags/basicMPU6050) diff --git a/_collections/projects/Arduino Libraries/_posts/2020-09-20-3d_datatypes.md b/_collections/projects/Arduino Libraries/_posts/2020-09-20-3d_datatypes.md deleted file mode 100755 index 93e25cd..0000000 --- a/_collections/projects/Arduino Libraries/_posts/2020-09-20-3d_datatypes.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: post -title: "Datatypes for 3D vectors and quaternions" ---- - -This is a library for 3d vectors and quaternions. It includes two structs to define each datatype. Both vectors and quaternions can perform basic operations such as addition, subtraction, multiplication, division, increment, decrement, and their analogs for multiplication and division. Vectors and quaternions are also compatible with each other. - -Included are other operations such as vector dot product and cross product. Quaternions can also be constructed as unit quaternions to represent rotations. They can also rotate vectors. Both datatypes are compatible with arrays, meaning that a length-3 array can be added, subtracted, etc from a vector. This also applies to quaternions. - -For more information on vector and quaternion operations, see these links: - -- [Quaternions and rotations](http://danceswithcode.net/engineeringnotes/quaternions/quaternions.html) -- [Quaternion operations](http://graphics.stanford.edu/courses/cs348a-17-winter/Papers/quaternion.pdf) -- [Vector operations](http://emweb.unl.edu/Math/mathweb/vectors/vectors.html) - -![image](https://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/transforms/axis.gif) -![image](https://opentextbc.ca/calculusv3openstax/wp-content/uploads/sites/288/2019/08/CNX_Calc_Figure_12_02_011.jpg) - -### Github Repo: -[VectorDatatype](https://github.com/RCmags/vector_datatype) - - diff --git a/_collections/projects/Arduino Libraries/_posts/2020-12-12-adns3080.md b/_collections/projects/Arduino Libraries/_posts/2020-12-12-adns3080.md deleted file mode 100755 index 7355b0b..0000000 --- a/_collections/projects/Arduino Libraries/_posts/2020-12-12-adns3080.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: post -title: "Interface for the ADNS-3080 optical-flow mouse sensor" ---- - -This is an Arduino library for ADNS3080 mouse sensor. It provides a simple interface to retrieve motion and frame data from the sensor. It is generally sold as a module with a lens attached. This code was written for such a module. The following schematic shows how to connect the module to an arduino uno. It's the same for other boards except the SPI spins change. - -![image](https://raw.githubusercontent.com/RCmags/ADNS3080/main/extras/ADNS3080_arduino_wiring.jpg) - -To focus the camera see the following repo: [ADNS3080_frame_capture](https://github.com/RCmags/ADNS3080_frame_capture). It contains an arduino sketch and a python script that work in conjunction with this library. - -### References: -Credit goes to Lauszus and Neumi for on their code to get the sensor to work with arduino. This library is essentially a repackaging of their code into a neater form. -https://github.com/Lauszus/ADNS3080 -https://github.com/Neumi/OpticalFlowA3080ArduinoProcessing - -For more information on this sensor see the [datasheet](https://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/s2009/ncr6_wjw27/ncr6_wjw27/docs/adns_3080.pdf) - -The schematic was found on this [forum post](http://forum.arduino.ir/8/21/391.html) (the page also contains another library). - -### Github Repo: -[ADNS3080](https://github.com/RCmags/ADNS3080) diff --git a/_collections/projects/Autogyros/_posts/2017-09-07-tailless_autogyro.md b/_collections/projects/Autogyros/_posts/2017-09-07-tailless_autogyro.md deleted file mode 100755 index 03b4e1f..0000000 --- a/_collections/projects/Autogyros/_posts/2017-09-07-tailless_autogyro.md +++ /dev/null @@ -1,101 +0,0 @@ ---- -layout: post -title: "Autogyro stabilized by an offset hinge without a horizontal stabilizer" - -# image sliders: -slider1: -- url: https://rcmags.github.io/img/autogyro/offset_pos.png -- url: https://rcmags.github.io/img/autogyro/offset_neg.png - -slider2: -- url: https://raw.githubusercontent.com/RCmags/rcmags.github.io/main/img/autogyro/version1/front.JPG -- url: https://raw.githubusercontent.com/RCmags/rcmags.github.io/main/img/autogyro/version1/side.JPG - -slider3: -- url: https://raw.githubusercontent.com/RCmags/rcmags.github.io/main/img/autogyro/version1/rotor1.JPG -- url: https://raw.githubusercontent.com/RCmags/rcmags.github.io/main/img/autogyro/version1/rotor2.JPG - -slider4: -- url: https://raw.githubusercontent.com/RCmags/rcmags.github.io/main/img/autogyro/version2/front.JPG -- url: https://raw.githubusercontent.com/RCmags/rcmags.github.io/main/img/autogyro/version2/side.JPG -- url: https://raw.githubusercontent.com/RCmags/rcmags.github.io/main/img/autogyro/version2/rotor.JPG - ---- - -# Introduction to concept - -An autogyro is an aircraft kept aloft by a rotor that spins by moving through the air. The aircraft is powered by a propeller that pushes it to maintain airspeed. The rotor does not suffer from an abrupt stall like a wing and allows the aircraft to descent vertically like a parachute. However, the rotor needs motion between itself and the air to generate lift so an autogyro cannot hover in the air like a helicopter. - -One can think of an autogyro as a machine with a pneumatic transmission. Instead of the engine powering the rotor directly like in a helicopter, the engine imparts relative energy to the air that in turn drives the rotor. In this sence, air acts as a kind of working fluid that transfers power from the engine to the rotor. - -{% include youtube.html id='_25H9ZPE2So' %} - -Because the air drives the motion, the rotor does not create a reaction torque like a helicopter. The drawback is that a pneumatic transmission is not as efficient as a mechanical transmission. The rotor is a kind of an axial wind turbine and operates an angle to the airflow. Like all wind turbines, the rotor cannot absorb all of the power in the incoming air. Add to this the inefficiency in the propeller and the overall efficiency is poor compared to a gearbox. If properly lubricated, a gearbox can achieve an efficiency in excess of 90%. - -Nonetheless, the air-driven rotor has a significant advantage when it comes to stability. As the air flows through the bottom of the rotor, the rotor induces a force parallel to the plane of the disk that tends to stabilize the autogyro. By comparison, a helicopter has a top-to-bottom airflow that reverses the planar force and destabilizes the aircraft. Hence, one faces the compromise between stability versus efficiency when comparing an autogyro with a helicopter. - -{% include image.html src="http://www.aviastar.org/theory/rotor_4.gif" maxwidth="400px" %} - -# Initial design -_Landing gear_: - -The propeller could be located at the nose of the aircraft in a tractor configuration or farther aft in a pusher configuration. A tractor configuration shifts the center of mass forward which aids stability. It also ensures the propeller is far away from the rotor and reduces the risk of collision. However, it exposes the propeller to the ground making it very likely it will break during a crash. - -![image](https://rcmags.github.io/img/autogyro/tractor_prop.png) - -The pusher configuration can shield the propeller with the front of the aircraft but the propeller is now very close to the rotor. It takes very little deflection for the rotor to collide with the propeller. Obviously this is catastrophic. - -![image](https://rcmags.github.io/img/autogyro/pusher_prop.png) - -The collision can be avoided by rotating the mast to move the propeller forward and under the rotor. Doing so moves the center of mass forward so less ballast is needed in the nose to maintain equilibrium. - -![image](https://rcmags.github.io/img/autogyro/pusher_hidden.png) - -_Offset-hinge:_ - -In the absence of a horizontal stabilizer the autogyro needs another mechanism to obtain pitch stability. A horizontal stabilizer applies a moment that rotates the aircraft towards a smaller angle of attack. This moment can be reproduced with a lever between the mast and the rotor. Due to the distance between the rotor and the hinge, the rotor's axial force will apply torque to the lever. The torque can be countered with a spring attached to the lever. - -![image](https://rcmags.github.io/img/autogyro/offset_balance.png) - -As the spring is elastic, it will deflect when the force changes. With more angle of attack, the axial force increases and the spring expands. With less angle of attack, the axial force decreases and the spring compresses. These deflections move the line-of-action of the force relative to the center of mass and generate a moment that rotates the aircraft to a smaller angle of attack. - -{% include image-slider.html list=page.slider1 %} - -# Design iterations and development - -The model autogyro required multiple iterations before it reached a satisfying design. It also required analyzing the flight mechanics to make an educated guess about what should be modified. - -__Iteration 1:__ -The first iteration used a conventional landing gear configuration. While it was simple and only required three wheels, the configuration was unstable during landings. The Friction of the front tires induced a braking force that unloaded the rear wheel. As the main wheels were in front of the center of mass, the torque caused by their cornering force caused the vehicle to rotate towards a sharper turn. This was destabilizing and caused the aircraft to roll over during landings. - -![image](https://hangar.modelairplanenews.com/members/files/2020/10/1.jpg) - -The design of the offset hinge also went through 2 iterations. Initially it was a lever connected to a spring. While it worked it felt excessively complicated. The spring was also too soft and caused pitch control to be unresponsive. The second iteration was a flexible strap that behaved like a leaf spring. It was much simpler and could be made stiffer by increasing the thickness. - -{% include image-slider.html list=page.slider2 %} -

Lateral views of Autogyro

- -{% include image-slider.html list=page.slider3 %} -

Rotor head: hinge with spring and later leaf spring

- -{% include youtube.html id='ps-KYJPquqs' %} -

Video 1. Flight of 1rst iteration

- -After the hinge modification, the aircraft flew quite well aside from its unfavorable ground handling. It seemed like the aircraft had neutral pitch stability. It was not unstable, it did not return to a low angle of attack very quickly. This was especially noticeable at low airspeeds where there wasn't a strong tendency for the nose to drop. Instead the attitude merely stayed where it was. - -__Iteration 2:__ -The second iteration fixed the landing gear by using a tricycle configuration. The front wheel was given a caster and the the main wheels located behind the center of mass. In addition to this, a wheel was added to the tail boom to protect it during landings. Braking would load the front wheel but due to the caster, the wheel did not make strong cornering forces. At the same time, the cornering force of the rear wheels would act behind the center of mass. This combination proved stable as the moment would rotate the vehicle to a wider turn, drastically reducing the likelihood of a rollover. - -In addition to this, the motor mount was modified to one adjust the position of the propeller. Rather than a fixed block onto which the motor bolted onto, the mount was a plate with a slot that allowed the motor to move vertically. This made it easy to align the thrust line with the center of mass. It is extremely important these two must align to avoid the possibility of powered-push-over. - -{% include youtube.html id='RCiWSCi7bfk' %} -

Explanation of powered-push-over

- -Should this happen, the aircraft will suddenly pitch forward in an unrecoverable dive when the rotor unloads. Another modification was a softer hinge. After these changes the aircraft was farly stable and easy to fly by an experienced pilot. The pitch stability was somewhat better but it was still neutral compared to an airplane. - -{% include image-slider.html list=page.slider4 %} -

Lateral views of Autogyro

- -{% include youtube.html id='b1p8pCHiuWo' %} -

Video 2. Flight of 2nd iteration

- diff --git a/_collections/projects/Miscellaneous/_posts/2018-05-17-four_bar_sim.md b/_collections/projects/Miscellaneous/_posts/2018-05-17-four_bar_sim.md deleted file mode 100755 index f3b4d9a..0000000 --- a/_collections/projects/Miscellaneous/_posts/2018-05-17-four_bar_sim.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -layout: post -title: "Simulation of a four-bar linkage" ---- - -This is a simple 2D simulation of a four bar linkage written in __python 2__. The lengths of the bars can be changed at the start of the program, as can the mass of the driving and driven bars. For simplicity, the intermiate bar that acts as a conrod is assumed to be massless. Other inputs are the initial angular velocity of the driving bar and a constant external torque acting on said bar. - -As the system reduces to a single degree freedom, only one variable is solved for, mainly, the angle of the driving bar with respect to the horizontal. The solution to the resulting differential equation is then used to control the angle of the input bar during the animation phase of the program. - -The output is a canvas animation of the linkage mechanism rotating under the absense damping forces (System energy is conserved). This animation can then be saved as a video that is created in the same location as the .py file. - -Here are some examples of the script's output: -![image](https://raw.githubusercontent.com/RCmags/FourBarSimulation/main/example_pics/short_bar_anim.gif) -![image](https://raw.githubusercontent.com/RCmags/FourBarSimulation/main/example_pics/short_graph.png) - -![image](https://raw.githubusercontent.com/RCmags/FourBarSimulation/main/example_pics/long_bar_anim.gif) -![image](https://raw.githubusercontent.com/RCmags/FourBarSimulation/main/example_pics/long_graph.png) - -### Github Repo: -[FourBarSimulation](https://github.com/RCmags/FourBarSimulation) - diff --git a/_collections/projects/Miscellaneous/_posts/2018-12-03-sort_algorithm.md b/_collections/projects/Miscellaneous/_posts/2018-12-03-sort_algorithm.md deleted file mode 100755 index 6b9d5c1..0000000 --- a/_collections/projects/Miscellaneous/_posts/2018-12-03-sort_algorithm.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: post -title: "Soring algorithm comparison and linked list" ---- - -These are programs to compare the speed of basic sorting algorithms an a linked list data type. For an array of 15000 elements, this is how the algorithms fare: -![image](https://raw.githubusercontent.com/RCmags/SortingAlgorithmCompare/main/data/sort_compare.png) - -The linked list is easily visualized with this diagram: -![image](https://3.bp.blogspot.com/-sXOQBd_OCR8/WBBn3QNhOiI/AAAAAAAAALQ/ysaUNOhKMoY59zw2cRxcHioHzdvn8HdNgCLcB/s1600/simpleLinkedList.png) - -### Github Repo: -[SortingAlgorithmCompare](https://github.com/RCmags/SortingAlgorithmCompare) diff --git a/_collections/projects/Miscellaneous/_posts/2019-06-18-basic_calc.md b/_collections/projects/Miscellaneous/_posts/2019-06-18-basic_calc.md deleted file mode 100755 index d7b43be..0000000 --- a/_collections/projects/Miscellaneous/_posts/2019-06-18-basic_calc.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -layout: post -title: "GUI for a basic calculator" ---- - -This is a simple calculator GUI made with tkinter that is written in __python 3__. The calculator can perform basic operations such as addition, subtraction, multiplication and division. Beyond that it can delete the last input character (DEL) and it can clear the stored input (CE). It effectively mimmicks a cheap hand-held calculator. - -To use the calculator, simply execute "simple_calc.py" with the python shell. If succesful, this should be the output: -![image](https://raw.githubusercontent.com/RCmags/Calculator-GUI/main/sample_shot.png) - -### Github Repo: -[Calculator-GUI](https://github.com/RCmags/Calculator-GUI) - diff --git a/_collections/projects/Miscellaneous/_posts/2019-06-24-meteor_sim.md b/_collections/projects/Miscellaneous/_posts/2019-06-24-meteor_sim.md deleted file mode 100755 index a229b22..0000000 --- a/_collections/projects/Miscellaneous/_posts/2019-06-24-meteor_sim.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -layout: post -title: "Simple meteor simulator displayed on a terminal" ---- - -This is a program that attempts to simulate a meteor around a planet through the windows console. -The code uses the [conio.h](https://www.programmingsimplified.com/c/conio.h) library to move the cursor and change the text color. -It's fairly simple to use and has a small menu that is executed at the start of the program. -In case the the meteor reaches the boundary of the console, -it will elastically collide the boundary and continue to bounce around the confined space. - -![image](https://raw.githubusercontent.com/RCmags/MeteorSim/main/img/meteor_motion.gif) - -![image](https://raw.githubusercontent.com/RCmags/MeteorSim/main/img/menu_pic.png) - -### Github Repo: -[MeteorSim](https://github.com/RCmags/MeteorSim) diff --git a/_collections/projects/Miscellaneous/_posts/2019-11-26-graphing_calc.md b/_collections/projects/Miscellaneous/_posts/2019-11-26-graphing_calc.md deleted file mode 100755 index 49154fb..0000000 --- a/_collections/projects/Miscellaneous/_posts/2019-11-26-graphing_calc.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -layout: post -title: "Browser-based graphing calculator" ---- - -This is a basic graphing calculator implemented in Javascript and is meant to be run from a web browser. The user can plot up to 3 equations at the same time, and they can also translate or zoom in or out the field of view. To use the calculator, simply go to the project page of this [repo](https://rcmags.github.io/Browser-Graphing-Calculator/). Here is an example of the output: - -![image](https://raw.githubusercontent.com/RCmags/Browser-Graphing-Calculator/main/plot_example.png) - -### Github Repo: -[Browser-Graphing-Calculator](https://rcmags.github.io/Browser-Graphing-Calculator) - diff --git a/_collections/projects/Miscellaneous/_posts/2020-09-18-tracked_vehile_sim.md b/_collections/projects/Miscellaneous/_posts/2020-09-18-tracked_vehile_sim.md deleted file mode 100755 index 79eac12..0000000 --- a/_collections/projects/Miscellaneous/_posts/2020-09-18-tracked_vehile_sim.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: post -title: "2D simulation of a tracked vehicle" ---- - -This is a simple 2D simulation of a tracked vehicle composed of two rectangular tracks attached to a central plate. It is written in __Python 3__. - -By track we refer to a continous belt that is in contact with the ground (also known as a tank tread). As it is in contact with the ground over a large area and not concentrated at a single point, the contact area is subdivided into a grid of contact elements. The friction force acting on these elements is then numerically integrated using simpson's rule, and these results are used as estimates for the net force and torque acting on the track. These forces are then combined under the assumption that the vehicle is a rigid body to generate the net forces acting on the vehicle. - -The net vehicle force and torque are then integrated twice using the trapezoidal rule to find its instantaneous velocity and position. These velocity estimates are fed back into the track force routine to calculate a new iteration of velocity and position estimates - Esenstially, a system of ordinary differential equations is solved simultaneously in order to find the state of the vehicle. - -Finally, the position and orientation data is used to move a simple canvas animation which is displayed at the end of the program. This animation can then be saved as a video that is created next to the .py file. - -Here are some examples of the script's output: -![image](https://raw.githubusercontent.com/RCmags/TrackVehicleSimulation/main/example_pics/high_coeff_anim.gif) -![image](https://raw.githubusercontent.com/RCmags/TrackVehicleSimulation/main/example_pics/med_coeff_anim.gif) -![image](https://raw.githubusercontent.com/RCmags/TrackVehicleSimulation/main/example_pics/low_coeff_anim.gif) - -### Github Repo: -[TrackVehicleSimulation](https://github.com/RCmags/TrackVehicleSimulation) diff --git a/_collections/projects/Miscellaneous/_posts/2020-12-15-adns30380_output.md b/_collections/projects/Miscellaneous/_posts/2020-12-15-adns30380_output.md deleted file mode 100755 index dfec1ab..0000000 --- a/_collections/projects/Miscellaneous/_posts/2020-12-15-adns30380_output.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -layout: post -title: "Render the output of an ADNS-3080 sensor as a grayscale image" ---- - -This repo contains a python script and an arduino sketch to render the output of an ADNS3080 mouse sensor as a grayscale image. This is ideal for focusing the lens on the sensor as its obvious when an image is blurry. Doing so greatly improves the SQUAL value and the subsequent motion detection. - -The script was written in __python 3__ and requires the [pyserial library](https://pythonhosted.org/pyserial/pyserial.html#overview). The arduino sketch makes use of the [ADNS3080 library](https://github.com/RCmags/ADNS3080). Credit goes to [Lauszus](https://github.com/Lauszus/ADNS3080) for the inspiration. The script is largely based on his work. - -Both files work in conjunction and must have the same __baud rate__ and __begin character__. This last value controls when the python script starts and stops receiving information from the arduino. - -A properly focused camera should generate these kinds of images: -![image](https://raw.githubusercontent.com/RCmags/ADNS3080_frame_capture/main/images/car.png) -![image](https://raw.githubusercontent.com/RCmags/ADNS3080_frame_capture/main/images/hand.png) -![image](https://raw.githubusercontent.com/RCmags/ADNS3080_frame_capture/main/images/ruler.png) - -### Github Repo: -[ADNS3080_frame_capture](https://github.com/RCmags/ADNS3080_frame_capture) - diff --git a/_collections/projects/Ornithopters/_posts/2018-09-07-motor_ornithopter.md b/_collections/projects/Ornithopters/_posts/2018-09-07-motor_ornithopter.md deleted file mode 100755 index a89e722..0000000 --- a/_collections/projects/Ornithopters/_posts/2018-09-07-motor_ornithopter.md +++ /dev/null @@ -1,69 +0,0 @@ ---- -layout: post -title: "Ornithopter powered by a motor with a crank-shaft" - -# image sliders: -slider1: -- url: /img/motor_orni/crank-1.JPG -- url: /img/motor_orni/front-vtail.JPG -- url: /img/motor_orni/front-inverted.JPG - -slider2: -- url: /img/motor_orni/crank-2.JPG -- url: /img/motor_orni/front-inverted-cambered.JPG -- url: /img/motor_orni/side-2.JPG - ---- - -# Introduction to concept -This project concerns itself with the development of an ornithopter powered by a motor driving a crank-shaft. - -# Design iterations -__Iteration 1:__ - -{% include image-slider.html list=page.slider1 local='yes' %} - -{% include youtube.html id='wVLkWb_JHCo' %} -

Video 1. Ornithopter with inverted V-tail

- -__Iteration 2:__ -{% include youtube.html id='peSMr35mHOE' %} -

Video 2. Cambered wings and bias springs

- -{% include image-slider.html list=page.slider1 local='yes' %} - -# Arduino Code -This is a sketch for the [glide lock](http://ovirc.free.fr/GLDAB_English.php) of a crank-driven ornithopter. -It uses the [PinChangeInterrupt](https://github.com/NicoHood/PinChangeInterrupt) library to read a PWM signal from a transmitter. - -The glide lock works by iddling the motor below a certain throttle until the crankshaft reaches a known position. -Doing so allows to wings to stop a dihedral angle that allows for efficient gliding flight. -To accomplish this the code uses a hall sensor that looks for a magnet attached to the crank. -Once the magnet is infront of the sensor the motor turns off. - -Unfortunately some ESC's respond with a delay to throttle commands. -This means that the motor will continue to spin even after the throttle is set to zero. -In practice this means the crank will stop at the wrong position. -To work around this one can run the motor for a short time interval after the magnet passes the sensor. -If this delay is tuned correctly the crank will stop in the desired position. - -There are two versions of the sketch: one that's intended for an analog hall sensor and uses polling, -and one that's intended for a digital hall sensor and uses an external interrupt. -Both work well although the interrupt version can recognize the magnet at higher RPM's. - -This code was made to work for the following circuit: -![image](https://raw.githubusercontent.com/RCmags/GlideLock/main/glide_lock_schem.png) - -{% include youtube.html id='v0z1ojpoehQ' %} -

Video 3. Operation of glide-lock

- -__Github Repo:__ [GlideLock](https://github.com/RCmags/GlideLock) - -# RCgroups build log -For more informatio on this aircraft, see these posts on RCgroups: -1. [Gearbox construction](https://www.rcgroups.com/forums/showpost.php?p=41363327&postcount=76) -2. [Adding second stage to gearbox](https://www.rcgroups.com/forums/showpost.php?p=41380437&postcount=80) -3. [Adding wings](https://www.rcgroups.com/forums/showpost.php?p=41415689&postcount=81) -4. [Completing the frame and adding the electronics](https://www.rcgroups.com/forums/showpost.php?p=41423997&postcount=82) -5. [Initial test flights](https://www.rcgroups.com/forums/showpost.php?p=41432795&postcount=85) -6. [Succesful controlled flight](https://www.rcgroups.com/forums/showpost.php?p=41439849&postcount=87) diff --git a/_collections/projects/Ornithopters/_posts/2019-02-01-servo_ornithopter.md b/_collections/projects/Ornithopters/_posts/2019-02-01-servo_ornithopter.md deleted file mode 100755 index 107586e..0000000 --- a/_collections/projects/Ornithopters/_posts/2019-02-01-servo_ornithopter.md +++ /dev/null @@ -1,128 +0,0 @@ ---- -layout: post -title: "Ornithopter powered and controlled by servos" - -# image sliders: -slider1: -- url: /img/servo_orni/version1-1.jpg -- url: /img/servo_orni/version1-2.JPG - -slider2: -- url: /img/servo_orni/version2-1.JPG -- url: /img/servo_orni/version2-2.jpg -- url: /img/servo_orni/version2-3.jpg - -slider3: -- url: https://raw.githubusercontent.com/RCmags/ServoFlappingControl/main/example_pics/servo_body_res.jpg -- url: https://raw.githubusercontent.com/RCmags/ServoFlappingControl/main/example_pics/bottom_view_res.JPG -- url: https://raw.githubusercontent.com/RCmags/ServoFlappingControl/main/example_pics/flap_motion.gif - ---- - -# Introduction to concept -[Ornithopters](https://en.wikipedia.org/wiki/Ornithopter) are aircraft that use oscillating wings to stay aloft. Depending on the characteristics of the aircraft, an ornithopter can maintain flight at a constant velocity like a bird, or it can fly in static air like an insect. These scenarios are analogous to an airplane driven by a propeller and a helicopter at hover. - -{% include youtube.html id='f50K68zB4eU' %} -

Video A. Bird in horizontal flight

- -{% include youtube.html id='2z9F6pVhR5o' %} -

Video B. Insect at hover

- -There are a few advantages to ornithopters. In horizontal flight, the wings of an ornithopter can sweep over a much larger area compared to a propeller. According to [actuator disk theory](https://web.mit.edu/16.unified/www/FALL/thermodynamics/notes/node86.html), this increase in the area can increase the propulsive efficiency of the aircraft. Likewise, oscillating wings do not suffer from [dissymetry of lift](https://www.copters.com/aero/lift_dissymetry.html) and [gyroscopic precession](http://www.cleonis.nl/physics/phys256/gyroscope_physics.php) like a rotary-wing. The absence of these forces can enhance the natural stability of an ornithopter compared to a helicopter. - -# Initial aircraft design -This project concerns itself with developing a radio-controlled ornithopter powered and controlled by two servos. Each servo is connected to a wing and flapped independently. This allows the motion of the wings to be controlled through software rather than through a specially designed mechanism. There are many advantages to this approach, mainly that it is very easy to adjust the amplitude of the flapping motion, and the wings may be oscillated asymmetrically to achieve directional control. - -![image](https://www.researchgate.net/profile/Yanghai-Nan/publication/280948641/figure/fig1/AS:614244433289216@1523458693052/Control-via-flapping-amplitude-offset-modulation.png) - -# Aircraft Iterations - -__Iteration 1:__ -The first version was a test platform to observe how effectively servos could oscillate a long spar. It also served to test springs connected to the servos in series or parallel. These springs can [reduce the power drawn by an oscillating mass](https://www.rcgroups.com/forums/showpost.php?p=41117281&postcount=20) driven by a motor if tuned correctly. For this design, a a coil spring was connected in series with the servo and a leaf spring was used for a parallel connection. - -{% include image-slider.html list=page.slider1 local='yes' %} - -__Iteration 2:__ -The second iteration was a complete aircraft. The design employed a pair of [skewed hinges](https://www.rcgroups.com/forums/showpost.php?p=41151391&postcount=33) to hopefully achieve roll and pitch control. Unfortunately, test flights revealed this system did not work and barely redirected the aircraft. In addition to this, the servos were undersized and were under too much load. This resulted in the servos getting very hot to apply the desired torque. The wings were also inefficient and could not generate the required thrust for the aircraft to sustain flight. - -{% include image-slider.html list=page.slider2 local='yes' %} - -__Iteration 3:__ -The third iteration built upon the second version. Control was accomplished separately through a controllable tail, and larger servos with four times the torque were used to reduce the likelihood of excess torque. To complement this, the servos were connected indirectly to the wings via a lever arm to double the torque applied to the wings. While this overcame the issues of driving the wings, the wing design was lacking. To overcome this limitation, different wing designs revealed large wings with a high degree of flexibility allowed the aircraft to maintain powered flight. - -{% include image-slider.html list=page.slider3 %} - -# Arduino Code -The program is designed to receive 3 PWM inputs from an RC receiver operating in [MODE 2](https://www.rc-airplane-world.com/rc-transmitter-modes.html) and outputs 2 PWM signals for off-the-shelf hobby servos. The aileron (1) and elevator (2) channels are used to bias the dihedral angle of each wing, with the aileron rotating the wings in unison while the elevator changes the dihedral angle. The throttle channel (3) changes the amplitude of a fixed-frequency oscillation. - -There are three wave-forms the user can select: sine wave, triangle wave, and saw wave. The controller also is equipped with a low-voltage cutoff routine. This will disable the throttle channel to prevent over-discharging a battery. The routine uses an analog pin to read the input voltage via a voltage divider. The program was written for an Arduino Nano, but it should be compatible with other boards. -It requires the [PinChageInterrupt](https://www.arduino.cc/reference/en/libraries/pinchangeinterrupt/) library. For more information on the controller, please see this [RCgroups post](https://www.rcgroups.com/forums/showpost.php?p=41325203&postcount=69). - -See the attached schematic for an example of the required circuit: -![image](https://raw.githubusercontent.com/RCmags/ServoFlappingControl/main/ReceiverServoFlap_VoltCutoff.png) - -__Github Repo:__ [ServoFlappingControl](https://github.com/RCmags/ServoFlappingControl) - -# Videos -Below are videos of different iterations of the aircraft: - -{% include youtube.html id='T6NfZD_iuEs' %} -

Video 1. Demonstration of servo controller

- -{% include youtube.html id='mhs4mhZv6aE' %} -

Video 2. Underpowered servos

- -{% include youtube.html id='tji2ks2tRWM' %} -

Video 3. Inefficient wings

- -{% include youtube.html id='1Y5dV8BgdM8' %} -

Video 4. Assymetric wing elasticity

- -{% include youtube.html id='EZ9vgVurDFM' %} -

Video 5. Segmented wing panels

- -# Construction blog -For much more detailed information on the steps taken to develop this aircraft, see this thread on RCgroups: [Attempts at a servo flap ornithopter](https://www.rcgroups.com/forums/showthread.php?3221699-Attempt(s)-at-a-servo-flap-ornithopter). The most important posts are shown below: - -1. [Very simple math model](https://www.rcgroups.com/forums/showpost.php?p=41093927&postcount=10) -2. [Energy and oscillating mass](https://www.rcgroups.com/forums/showpost.php?p=41104533&postcount=14) -3. [Elastic actuators - motors and springs](https://www.rcgroups.com/forums/showpost.php?p=41117281&postcount=20) -4. First iteration - the build begins!: - - [Part 1](https://www.rcgroups.com/forums/showpost.php?p=41126441&postcount=24) - - [Part 2](https://www.rcgroups.com/forums/showpost.php?p=41126441&postcount=25) -5. [Control via dihedral offset: Pitch-flap coupling](https://www.rcgroups.com/forums/showpost.php?p=41151391&postcount=33) -6. [Oscillating wing as 2nd order damped system](https://www.rcgroups.com/forums/showpost.php?p=41164641&postcount=36) -7. Second iteration: - - [New frame and servo horns](https://www.rcgroups.com/forums/showpost.php?p=41166873&postcount=37) - - [Wing build](https://www.rcgroups.com/forums/showpost.php?p=41183483&postcount=40) - - [Covering the wing](https://www.rcgroups.com/forums/showpost.php?p=41195325&postcount=43) - - [Completed wings and mounted electronics](https://www.rcgroups.com/forums/showpost.php?p=41229197&postcount=47) - - [Glide tests](https://www.rcgroups.com/forums/showpost.php?p=41251767&postcount=50) - - [Longer tail boom and additional spring](https://www.rcgroups.com/forums/showpost.php?p=41257839&postcount=52) - - [Wiring electronics](https://www.rcgroups.com/forums/showpost.php?p=41264455&postcount=55) - - [Arduino Code](https://www.rcgroups.com/forums/showpost.php?p=41273735&postcount=57) - - [Powered test flights](https://www.rcgroups.com/forums/showpost.php?p=41307103&postcount=61) - - [Adding low voltage cutoff](https://www.rcgroups.com/forums/showpost.php?p=41325203&postcount=69) - -8. [Maximum motor efficiency: Idealized case](https://www.rcgroups.com/forums/showpost.php?p=41250929&postcount=49) -9. [A simple model to determine servo speed and torque](https://www.rcgroups.com/forums/showpost.php?p=41350463&postcount=70) -10. Oscillating servo: - - [Initial experiment with springs](https://www.rcgroups.com/forums/showpost.php?p=41611419&postcount=106) - - [Current experiment #2](https://www.rcgroups.com/forums/showpost.php?p=41793219&postcount=114) - - [Direct and indirect drive](https://www.rcgroups.com/forums/showpost.php?p=42099773&postcount=118) - -11. Forth iteration: - - [Constructing the fuselage](https://www.rcgroups.com/forums/showpost.php?p=42335531&postcount=125) - - [Adding electronics and Tail](https://www.rcgroups.com/forums/showpost.php?p=42352337&postcount=130) - - [Membrane wings inspired on Hang glider Sail](https://www.rcgroups.com/forums/showpost.php?p=42368071&postcount=136) - - [Composite Foam-Fabric wings](https://www.rcgroups.com/forums/showpost.php?p=42374421&postcount=141) - - [Adding tail servos](https://www.rcgroups.com/forums/showpost.php?p=42379981&postcount=144) - - [Unsuccesful flight...](https://www.rcgroups.com/forums/showpost.php?p=42380089&postcount=145) - - [Experiments with wing articulation](https://www.rcgroups.com/forums/showpost.php?p=43071065&postcount=159) - - [Initial test with segmented wings](https://www.rcgroups.com/forums/showpost.php?p=47159375&postcount=188) - -12. [Measured oscillations - Updated Servo controller code - servoMotor Library](https://www.rcgroups.com/forums/showpost.php?p=43079349&postcount=164) -13. Analysis of the effects of wing elasticity: - - [Part 1](https://www.rcgroups.com/forums/showpost.php?p=43356729&postcount=172) - - [Part 2](https://www.rcgroups.com/forums/showpost.php?p=47154289&postcount=185) - diff --git a/_collections/projects/Robots/_posts/2018-11-18-line_follower.md b/_collections/projects/Robots/_posts/2018-11-18-line_follower.md deleted file mode 100755 index 48417d5..0000000 --- a/_collections/projects/Robots/_posts/2018-11-18-line_follower.md +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: post -title: "Line following robot" ---- - -This is an arduino sketch for a [line following robot](https://www.electronicshub.org/arduino-line-follower-robot/) based on infrared LED's and an H-bridge. -The code uses a PID controller to control the wheels of the vehicle so it steers into a dark line. -To improve the likelihood of the vehicle from sliding off the line, -the code decreases the speed of the robot when it enters a sharp turn. -In an effort to improve the low speed performance, -the speed of the motors is controlled via [pulse frequency modulation](https://en.wikipedia.org/wiki/Pulse-frequency_modulation). -This allows the motors to be moved under the influence of cogging torque and stiction as the pulses act like a jackhammer. -The end result is motion similar to stepper motor as the motor moves in discrete jumps of variable length. -At higher throttle settings the motors switch over to [PWM](https://en.wikipedia.org/wiki/Pulse-width_modulation) to smoothen the motion. - -The code requires a circuit like the one shown in this schematic: -![image](https://raw.githubusercontent.com/RCmags/LineFollowingRobot/main/line_follower_robot_schem.png) - -Below are images of the vehicle this code was written for: -![image](https://raw.githubusercontent.com/RCmags/LineFollowingRobot/main/img/bottom_view_res.jpg) -![image](https://raw.githubusercontent.com/RCmags/LineFollowingRobot/main/img/diag_view_res.jpg) -![image](https://raw.githubusercontent.com/RCmags/LineFollowingRobot/main/img/top_view_res.jpg) - -{% include youtube.html id='NBQjQLE4u1M' %} -

Video 1. Operation of the line following robot

- -### Github Repo: -[LineFollowingRobot](https://github.com/RCmags/LineFollowingRobot) diff --git a/_collections/projects/Robots/_posts/2019-06-11-self_balancing_robot.md b/_collections/projects/Robots/_posts/2019-06-11-self_balancing_robot.md deleted file mode 100755 index 7995f5d..0000000 --- a/_collections/projects/Robots/_posts/2019-06-11-self_balancing_robot.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: post -title: "Self balancing robot stabilized with a gyroscope" ---- - -This is an arduino sketch for a [self balancing robot](https://people.ece.cornell.edu/land/courses/ece4760/FinalProjects/f2015/dc686_nn233_hz263/final_project_webpage_v2/dc686_nn233_hz263/index.html). -This nothing more than a two wheeled platform that is unstable in one direction and must be stabilized to maintain balance. -The code provides the nessesary stabilization through a single MPU6050 gyroscope and does not use of rotary encoders. -Doin so allows the robot to be use inexpensive DC motors controlled through an H-bridge. - -The code works as follows: a complementrary filter is used to estimate the (pitch) angle of the vehicle relative to the horizontal. -A PID controller is driven by this angle and attemps to drive towards zero. -The output of the PID controller is then fed into a "torque function" that modifies the command. -This function attemps to counter friction in the motors -to ensure constant inputs generate constant torque on the vehicle. - -To accomplish this, the function integrates the control inputs at a specified rate. -This causes the motors to stay on even after a control input is zero. -As the control inputs are analogous to the acceleration felt by the vehicle, -this integral acts as an estimate for the velocity. -By the same analogy, integrating this term provides an estimate for the position. -One can use the position and velocity estimates to laterally stabilize the vehicle. -While this is not as precise as rotary encoders it is a simple and effective workaround. - -This allows the center of gravity of the vehicle to change in real time and the vehicle will bank itself to maintain equilibrium. -In essence, one has two PID loops acting simulatenously. -One that stabilizes the heading of the vehicle, and one that attempts to keep the vehicle form sliding back and forth. - -Here is a schematic of the required circuit: -![image](https://raw.githubusercontent.com/RCmags/selfBalancingRobot/main/self_balacing_robot_schem.png) - -Finally, this is the intended platform: -![image](https://raw.githubusercontent.com/RCmags/SelfBalancingRobot/main/images/side_view_res.jpg) -![image](https://raw.githubusercontent.com/RCmags/SelfBalancingRobot/main/images/top_view_res.jpg) -![image](https://raw.githubusercontent.com/RCmags/SelfBalancingRobot/main/images/motion_disturb.gif) -![image](https://raw.githubusercontent.com/RCmags/SelfBalancingRobot/main/images/motion_error.gif) - -### Github Repo: -[SelfBalancingRobot](https://github.com/RCmags/SelfBalancingRobot) diff --git a/_collections/projects/Robots/_posts/2020-05-10-autonomous_tracked_vehicle.md b/_collections/projects/Robots/_posts/2020-05-10-autonomous_tracked_vehicle.md deleted file mode 100755 index cac3a13..0000000 --- a/_collections/projects/Robots/_posts/2020-05-10-autonomous_tracked_vehicle.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -layout: post -title: "Tracked vehicle capable of following waypoints on a 3D surface" ---- - -This is a large arduino sketch for a stracked vehicle capable of driving itself to different waypoints. It is composed of multiple header files and a main.ino file. The sketch requires the following libraries: - -- [imuFilter](https://github.com/RCmags/imuFilter) -- [basicMPU6050](https://github.com/RCmags/basicMPU6050) -- [ADNS3080](https://github.com/RCmags/ADNS3080) -- [Vector datatypes](https://github.com/RCmags/vector_datatype) - -The position of the vehile is estimated using a physical model of the vehicle, an accelerometer that is integrated twice, a gyroscope for heading, and the displacement measured by two optical flow sensors. All of this data is fused to obtain the net displacements relative to an initial position using rectangular coordinates. These position and orientation estimates are used to guide the vehicle to a specified location using two PID loops, one for displacements and one for heading. - -The coordinates are stored in a buffer that can be filled in real time via a bluetooth module. Coordinates can be pushed or poped off the buffer. Once the vehicle is within a given radius of a coordinate, the following coodinate is made the target destination. This process will continue indefinitely and the vehicle will follow a closed path with the coordinates as the vertices. - -__Images:__ -![image](https://raw.githubusercontent.com/RCmags/TrackRobot/main/images/tank1_res.jpg) - -![image](https://raw.githubusercontent.com/RCmags/TrackRobot/main/images/tank2_res.jpg) - -![image](https://raw.githubusercontent.com/RCmags/TrackRobot/main/images/tank3_res.jpg) - -__Video:__ -![image](https://raw.githubusercontent.com/RCmags/TrackRobot/main/images/inclined_plane.gif) - -{% include youtube.html id='VYhLW5owS3A' %} -

Video 1. Operation of Autonomous robot

- -### Github Repo: -[TrackRobot](https://github.com/RCmags/TrackRobot) - diff --git a/_collections/projects/Tail-less Airplanes/_posts/2019-09-19-stabilized_airplane.md b/_collections/projects/Tail-less Airplanes/_posts/2019-09-19-stabilized_airplane.md deleted file mode 100755 index dd05655..0000000 --- a/_collections/projects/Tail-less Airplanes/_posts/2019-09-19-stabilized_airplane.md +++ /dev/null @@ -1,141 +0,0 @@ ---- -layout: post -title: "Tail-less airplane stabilized by an angle of attack sensor" - -# image sliders: -slider1: -- url: https://raw.githubusercontent.com/RCmags/TailLessStability/main//example_pictures/top_view_res.jpg -- url: https://raw.githubusercontent.com/RCmags/TailLessStability/main//example_pictures/front_view_res.jpg -- url: https://raw.githubusercontent.com/RCmags/TailLessStability/main//example_pictures/side_view_res.jpg - -slider2: -- url: /img/figures/thrustline_side.jpg -- url: /img/figures/thrustline_top.jpg - -slider3: -- url: /img/figures/larger_flap_top.jpg -- url: /img/figures/larger_flap_bottom.jpg - ---- - -# Introduction to concept - -For an airplane to maintain stability in flight, it must have the ability to self-correct in the face of external disturbances. When this occurs, the aircraft must cause the disturbance to decrease with time. We can refine this concept by separating it into two components: [static stability](https://ocw.tudelft.nl/wp-content/uploads/Hand-out-Stability_01.pdf) and [dynamic stability](https://www.aircraftflightmechanics.com/Dynamics/ModesofMotion.html). As the names imply, static stability is concerned with the forces acting on the aircraft in the absence of motion. That is, whether the forces acting on the aircraft reach [static equilibrium](https://physicscourses.colorado.edu/phys1110/phys1110_fa12/LectureNotes/StaticEquilibrium.pdf) and mutually oppose each other out. Dynamic stability is focused on whether the aircraft will slow down if pushed away from this equilibrium. - - -With these definitions, we can also notice that dynamic stability depends on static stability. Static stability ensures an equilibrium state, and dynamic stability ensures the aircraft can return to it. We can also observe an aircraft has multiple axes about which it can be stable. It can translate about three perpendicular directions, and it can rotate about these same axes: - -![image](https://www.researchgate.net/profile/Kayhan-Kurul/publication/342106041/figure/fig1/AS:901245149650948@1591884996881/Aircraft-Principal-Axes.ppm) -[See: Aircraft principal axes](https://en.wikipedia.org/wiki/Aircraft_principal_axes) - -Because the aircraft can move in six different directions, there are different ways these motions can combine to yield converging or diverging trajectories. These trajectories are known as [modes of stability](https://courses.cit.cornell.edu/mae5070/DynamicStability.pdf), and they determine the behavior of an uncontrolled aircraft. We can best understand these modes by watching them occur and then analyzing them through diagrams. - -{% include youtube.html id='rFWfrmjAQxY' %} -

Video 1. Modes of stability

- -Out of these possible trajectories, let us focus on the longitudinal stability of the aircraft, and in particular, the short period mode. This mode can be understood as the “elasticity and damping” of the aircraft with respect to the angle of attack. Video 1 shows behavior at the [2:53 minute](https://www.youtube.com/watch?v=rFWfrmjAQxY&t=173s) mark. This motion is caused by a restoring torque that rotates the aircraft about the pitch axis. If this torque is sufficiently strong, it will ensure that the aircraft maintains static and dynamic stability. - -![image](https://i1.wp.com/www.differencebetween.com/wp-content/uploads/2012/08/Dynamic-Stability.png?ssl=1) - -[See: Difference between static and dynamic stability](https://www.differencebetween.com/difference-between-static-stability-and-vs-dynamic-stability/) - -Ultimately, it's not important how the stabilizing torque is generated. It can be obtained by either _passive_ or _active_ means. Whatever the case, both methods have the same effect on longitudinal stability, but they have different effects on the lift and drag characteristics of the aircraft. - -# Passive Stability -It is possible to use the aircraft's structure and its mass distribution to induce passive stability. To accomplish this, the center of mass of an aircraft must be located _infront_ of its center of lift. This allows the lift to have a moment arm with respect to the center of mass. The result is that whenever the angle of attack changes, the lift change tends to twist the aircraft away from the rotation. We can think of the airplane's tendency to _weathervane_ into the airflow. In a conventional configuration with a tailplane and a wing, this tendency is easily understood by looking at the lift acting on the tail. The more lift it produces, the more it torques the fuselage. - -![image](/img/figures/wing_tailplane.png) - -In an alternative configuration, we can move the tail forward until it merges with the wing. By doing so, we reach what is known as a [reflexed airfoil](https://boernerc.org/resources/FlyingWing). No Longer does the tail keep the nose aloft, but instead the aft portion of the airfoil provides this function. - -![image](/img/figures/reflex_airfoil_low.png) - -Unfortunately, there is a large tradeoff with this configuration. Due to the upwards bent trailing edge, there is a decrease in the lift generated by the wing. This effect is worsened if the trailing edge is controlled like a flap. If the flap is raised to provide more reflex, it will generate a downwards force near the trailing edge that will rotate the airfoil to a higher angle of attack. This greater angle, in turn, forces the airfoil to produce more lift with a shape that is _worse_ at producing additional lift. - -![image](/img/figures/reflex_airfoil_high.png) - -Evidently, this is a highly inefficient situation. It is especially bad during turns or low-speed flight, as the wing must operate at high angles of attack. An aircraft needs _additional_ lift to stay aloft under these conditions. Despite these problems, a reflexed airfoil is still a viable way to stabilize an airplane. - -{% include youtube.html id='hH2GXpVNfg8' %} -

Video 2. Demonstration of reflexed airfoil

- -# Active Stability -The inefficiency of a reflexed airfoil can be side-stepped by moving the center of mass aft. This displacement allows the flap to be deflected downwards rather than upwards to maintain static equilibrium. Unfortunately, this configuration is unstable as the aerodynamic center is in front of the center of mass. - -![image](/img/figures/cambered_airfoil_low.png) - -We can oppose the instability by _forcing_ the aircraft to be stable by adjusting the rear flap. With a sufficiently large deflection, the flap can force the airfoil to rotate into the airflow, despite the front of the airfoil wanting to do the opposite. - -![image](/img/figures/cambered_airfoil_high.png) - -This configuration has the advantage that the flap must deflect downward with a greater angle of attack to maintain equilibrium. The additional camber is helpful as it enhances the lift generated by the larger angle. This positive relationship is also beneficial at lower angles as it tends to increase the [lift-to-drag ratio](https://www.grc.nasa.gov/www/k-12/airplane/ldrat.html) of the entire aircraft. To everyone’s advantage, there are a few examples of this kind of actively stabilized airplane available on the internet. While the details of each project vary, the underlying concept is much the same: obtain stability through active deflections of the rear flap and move the center of mass aft. - -{% include youtube.html id='JfKrUbJYk74' %} -

Video 3. Unstable Tailless Demonstrator

- -{% include youtube.html id='6mny0neFUxE' %} -

Video 4. Slope Soaring Actively Stabilized Flying Wing

-[See: Albatross, Active Pitch Glider](http://www.charlesriverrc.org/articles/asfwpp/lelke_activepitch.htm) - -# Preliminary concept -Inspired by the above aircraft, this project concerns itself with developing an actively stabilized airplane using inexpensive equipment. The design consists of two high-speed servos, an Arduino nano, a potentiometer, and a foam airframe. The potentiometer is used as an angle of attack sensor and is connected to the Arduino. The Arduino then uses this signal to control the servos connected to the control surfaces. Whenever the sensor measures a change in angle, the Arduino commands the servos to deflect the control surfaces and stabilize the aircraft. - -The simplest angle-of-attack sensor is a [simple low-friction potentiometer attached to a weathervane](https://www.ilmailu.org/forum/index.php?action=dlattach;topic=5147.0;attach=10336). As the weathervane will closely follow the local airflow, it can be used as a reference from which to measure the angle of attack. Likewise, the Arduino can be programmed to use the analog signal from the sensor as the proportional term of a [PID controller](https://en.wikipedia.org/wiki/PID_controller). By adjusting the appropriate coefficients, the static and dynamic stability of the aircraft can be greatly enhanced. - -# Design iterations - -__Iteration 1:__ - -The first version of the aircraft was designed to have _passive stability_. The idea was to enhance its stability electronically and use this _excess_ stability to move the center of mass aft. This stability would make it easy to progressively move the mass and observe the behavior of the aircraft. Eventually, the mass would move aft enough to cause the aircraft to depend on the active stabilization. As a consequence, the flaps would deflect downwards to maintain equilibrium. - - -The aircraft was also equipped with a motor and a propeller to fly under its own power. However, this made it difficult to place the angle of attack sensor. The local airflow felt by the sensor is greatly affected by its location on the aircraft. Any regions behind the wing are disturbed by the large [downwash](https://www.grc.nasa.gov/www/k-12/airplane/downwash.html), and the [powerful slipstream](https://web.mit.edu/16.unified/www/FALL/thermodynamics/notes/node86.html) affects anything behind the propeller. A simple solution was to place the sensor atop a long vertical stabilizer. If it were tall enough, the sensor would lie outside the propeller's slipstream. Likewise, any lift caused by the fin would be perpendicular to the rotation of the sensor. This would minimize any effects it had on the measured angle. - -![image](/img/figures/sensor_airstream.png) - -The angle of attack sensor was very simple. The weathervane was a stick with a fin in the rear and a weight in the front. It was necessary to ensure the vane was balanced about the axis of the potentiometer to eliminate any inertial effects. If this were not the case, gravity and lateral accelerations would bias the measurement. The lever arm of the vane also had to be large enough to ensure the fin could overcome the friction of the potentiometer. In order to reduce this friction, any viscous grease around the shaft of the potentiometer was removed with a solvent. This modification allowed the sensor to respond quickly to dist the airspeeds encountered in flight. - -![image](/img/figures/aoa_sensor.jpg) - -This is what the completed airplane looked like: - -{% include image-slider.html list=page.slider1 %} - -Unfortunately, test flights revealed the [thrust line](https://www.flitetest.com/articles/Motor_angles_for_pusher_planes) was far below the center of mass. This offset caused the aircraft to raise its nose to the point it was very difficult to recover. Secondly, the response of the elevons about the pitch axis was very sluggish and made piloting the aircraft somewhat uncomfortable. Despite this, the airplane was capable of gliding without active stabilization. This behavior indicated there was an ample margin of passive stability. - -__Iteration 2:__ - -For the second iteration, the thrust line of the aircraft was rotated by tilting the firewall of the motor. Through trial and error, the motor was aligned such that the thrust did not generate a noticeable torque about the pitch and yaw axes. This was verified by running the motor at full throttle and letting the airplane enter free fall to see how it rotated. - -{% include image-slider.html list=page.slider2 aspect_ratio="2/1" %} - -The elevons were also made twice as large to increase the control authority and reduce lag in the control response. By extending the surfaces aft, not only did the area increase but so too did the lever arm with respect to the center of mass. - -{% include image-slider.html list=page.slider3 %} - -These modifications greatly enhanced the stability of the aircraft. Changes in throttle had a neutral effect on the attitude, and the pitch response was much faster. The next step was to adjust the PID controller and observe its effects on stability. - -- **Proportional term:** -At low settings, the gain had a negligible effect on stability. The aircraft rotated more slowly for a given elevator command as the gain increased. This change made the control response slightly faster. However, after a certain amount of gain, the aircraft would shake very rapidly if it gained enough airspeed. Because of this unstable behavior, the gain was set to a value slightly below this threshold. - -- **Derivative term:** -This had a similar effect to the proportional gain. It tended to slow down the aircraft's rotation and made the response "crisper". The aircraft settled to its new state with very little if any visible wobbling. Like before, the derivative gain would cause instability at higher speeds, so this threshold limited the maximum gain. - -- **Integral term:** -Unlike the previous terms that increased the resistance to pitch disturbances, this term didn't seem to increase the stability. Rather, the integral term did very little at low values, and at higher gains, it induced a very strong delay in the control response. This caused the aircraft to become unwieldy to pilot as prolonged inputs caused the aircraft to stay rotating for some time. Due to this delayed response, the integral term was disabled. - -Having obtained a level of excess stability, it was possible _destabilize_ the aircraft by moving the weight aft. This was done by taping a coin to the tail. Test flights showed it was only possible to shift the center of mass by a moderate amount. Beyond this point, the servos were _incapable of reacting quickly enough_ to stabilize the aircraft. It was evident the aircraft still depended on passive stability as the flaps still had _reflex_ while in flight. - - -Given this limitation, the aircraft will need to employ faster servos to eliminate its dependency on passive stability. An alternative solution is to slow down the dynamics by increasing the [moment of inertia](http://hyperphysics.phy-astr.gsu.edu/hbase/mi.html) of the pitch axis. This would allow the servos slowly at the cost of a sluggish pitch response. - -# Arduino Code -The program used for this project was designed to receive 2 PWM inputs from an RC receiver and an analog signal, and outputs two PWM signals for two servos. It is assumed the aircraft is controlled with two elevons. It was written for an Arduino Nano but it should be compatible with other boards. It requires the [PinChageInterrupt](https://www.arduino.cc/reference/en/libraries/pinchangeinterrupt/) library to decode the PWM signals. - -Here's the schematic of the required circuit: - -![image](https://raw.githubusercontent.com/RCmags/TailLessStability/main/tail_less_circuit_schem.png) - -__Github Repo:__ -[TailLessStability](https://github.com/RCmags/TailLessStability) - diff --git a/_collections/projects/Weight Shift Helicopters/Torque-control/_posts/2016-08-06-heli_torque_rotor.md b/_collections/projects/Weight Shift Helicopters/Torque-control/_posts/2016-08-06-heli_torque_rotor.md deleted file mode 100755 index 3098bc5..0000000 --- a/_collections/projects/Weight Shift Helicopters/Torque-control/_posts/2016-08-06-heli_torque_rotor.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -layout: post -title: "Torque-compliant rotor for collective control" ---- - -# Introduction to concept -This project concerns itself with developing a helicopter rotor that can automatically enter [autorotation](https://en.wikipedia.org/wiki/Autorotation). Most helicopters transition between powered by and unpowered flight through active control inputs from the pilot. The blades are set at a positive pitch angle in powered flight to produce lift. The blades are set to a much lower or negative pitch angle in autorotation to generate lift. - -![image](/img/torque_rotor/rotor-pitch.png) - -These changes in pitch can be accomplished automatically by using the torque acting on the rotor to dictate the pitch it requires to ensure lift. This is because, in powered flight, the rotor absorbs torque applied to it by a motor, while in autorotation, it is spun by the lift of the blades and there is little to no torque. This asymmetry in torque allows one to differentiate between both states. - -It must be mentioned that much of this project is inspired by the simplicity of the rotor of a radio-controlled autogyro. It is nothing more than a strap bolted onto a bearing housing in its simplest case. The blades attach to the strap, and [cyclic pitch](https://www.youtube.com/watch?v=04tJmP2aqcw) is accomplished by bending the strap. For part of the cycle the strap bends, and for the remaining half, it pitches the blades. - -![image](http://www.bartonhewsons.uk/home/modelflying/helicopters/Resources/IMG_0793.jpg) -[See: RC Autogyro - Panther build diary](http://www.bartonhewsons.uk/home/modelflying/helicopters/pantherbuilddiar.html) - -While an autogyro does not need collective pitch to fly, a helicopter greatly benefits from this ability. It allows the helicopter to rapidly change lift and allows the rotor to transition from powered (positive pitch) and unpowered (little or negative pitch) flight. This is generally accomplished through a swashplate controlling the blades. - -![image](https://www.rchelicopterfun.com/images/BellHead500pics.gif) -[See: Flybarless helicopter](https://www.rchelicopterfun.com/flybarless.html) - -As can be inferred, a helicopter rotor with cyclic and collective is far more complex than the flexplate used by an autogyro. Evidently, it is very appealing to modify the flexplate design to include collective control while maintaining its simplicity. - -# Initial design concept -The concept is to use the torque acting on the rotor to change the pitch angle of the blades. When the motor is on, it applies torque to the rotor and rotates the blades to a positive pitch. When the motor shuts off, there is no torque and the blades return to negative pitch for autorotation. An important inspiration for this concept is the [underactuated rotor](https://www.modlabupenn.org/wp-content/uploads/paulos_an_underactuated_propeller_IROS_2013.pdf) developed at the University of Pennsylvania: - -{% include youtube.html id='aEPf0QHVuMM' %} -

Video 1. Underactuated rotor cyclic

- -While this design is intended for cyclic pitch, the idea is valid for collective control. Mainly, one can exploit motor torque to pitch the blades. For cyclic control, the torque that causes the blades to lead and lag is the relative inertia between the blades and the motor. The motor accelerates faster than the blades, and this causes the blades to rotate relative to the skewed hinges. However, centrifugal forces resist this relative rotation, and the motor reaches an equilibrium deflection. - -![image](/img/torque_rotor/hinge-accel.png) - -Unfortunately, the skewed hinge used for cyclic control will not work for collective pitch. In this case, the force driving the lag of the blades is aerodynamic drag. Ideally, this force is kept very small to minimize the power drawn by the rotor. Consequently, the scant drag force barely deflects the blades as centrifugal force is much larger. - -![image](/img/torque_rotor/hinge-drag.png) - -The solution for the lack of deflection is to amplify the torque generated by drag. Even if the drag is small, it can still generate a large torque with an adequate mechanical advantage. A simple approach is to use a conrod connected to a lever that twists the blades. By making the effective lever arm longer, the force acting on the conrod is amplified, and this greater force generates a larger torque on the blade. - -![image](/img/torque_rotor/hinge-conrod.png) - -# Design iterations -__Iteration 1:__ -The first version of the helicopter did not have a collective pitch. Rather, the blades were set at a positive pitch and rotor RPM was changed to control altitude. This allowed the rotor to be very simple and let the aircraft's flight characteristics to be fine-tuned. Mainly, to identify the aircraft's stability and controllability about all three rotational axes. The yaw axis was expected to have robust control as it worked by changing the speed of a lightweight propeller. However, the pitch and roll axes were ambiguous as a gimballed rotor has a delayed response. - -{% include youtube.html id='GvAgDsWhSy0' %} -

Video 2. Fixed pitch rotor

- -Upon testing the aircraft, it was obvious [augmented stability](http://localhost:4000/aircraft/2021/09/26/heli_flight_controller.html) was necessary. Once this was added, the helicopter was quite controllable, although still with a noticeable lag in its controls. Despite this, it was possible to fine-tune the flight controller to achieve adequate control, both in hover and in forward flight. - -__Iteration 2:__ -The second iteration of the aircraft employed a self-adjusting rotor. The first version of the rotor was extremely simple and used string instead of conrods to transfer loads. While this worked, it placed large torque loads about the flexible strap carrying the blades. Nonetheless, while the load distribution left much to be desired, it did prove that a torque-compliant rotor was feasible. - -{% include youtube.html id='nCT1aNKzHTk' %} -

Video 3. Initial test of concept

- -Upon test flying the aircraft, it became obvious that altitude control was much faster. Collective changes allowed the aircraft to respond without the lag the rotor accelerating. Moreover, since the collective increased with motor torque, the rotor tended to maintain a similar RPM as the changes in pitch acted like a governor in a [constant speed propeller](https://www.boldmethod.com/learn-to-fly/aircraft-systems/how-a-constant-speed-prop-works/). - -__Iteration 3:__ -The next iteration of the aircraft refined the rotor design by replacing the strings with rigid linkages and adding ball bearings. While it was more complex, the modifications made adjusting the [blade tracking](https://www.rchelicopterfun.com/blade-tracking.html) much easier. This reduced vibrations from the rotor. - -![image](/img/torque_rotor/v1-overview.JPG) -

Overview of the aircraft

- -![image](/img/torque_rotor/v1-rotor-1.JPG) -

Side view of the rigid linkages

- -![image](/img/torque_rotor/v1-rotor-2.JPG) -

Closeup of the rigid linkages

- -{% include youtube.html id='zqMYG2y6rpQ' %} -

Video 4. String replaced with rigid linkages

- -__Iteration 4:__ -At this point, the torque-compliant rotor had been shown to work and all that was left was to improve the cyclic. The apparent lag was caused by the aircraft accelerating slowly for a given input. The acceleration could be increased by two means: reducing the [moment of inertia](http://hyperphysics.phy-astr.gsu.edu/hbase/mi.html), or increasing the distance between the rotor thrust vector and the center of mass. The airframe was rebuilt to incorporate these changes. To this end, the servos were placed at a lower position on the rotor mast, the rotor mast was extended, and the electronic components were grouped near the bottom of the mast. - -![image](/img/torque_rotor/v2-left.JPG) -

Left view of the improved airframe

- -![image](/img/torque_rotor/v2-right.JPG) -

Right view of the improved airframe

- -![image](/img/torque_rotor/v2-closeup.JPG) -

Closeup of the electronics

- -Besides a new airframe, the rotor was modified to have the conrods push rather than pull the rotor. This improved the loads on the conrods as the threads inside the sockets did not resist tension loads. The modification also changed the way the blades twisted. As the pitch increased, the conrods had a smaller angle relative to the lever arm connected to the blade. The resulting feedback loop naturally limited the maximum pitch of the blades. - -![image](/img/torque_rotor/v2-rotor-1.JPG) -

Top view of the reversed linkages

- -![image](/img/torque_rotor/v2-rotor-2.JPG) -

Side view of the reversed linkages

- -{% include youtube.html id='Q9cXrapfBSE' %} -

Video 5. Second iteration of the rotor

- -Overall, these changes improved the performance of the helicopter. The cyclic control was noticeably faster and rotor vibrations were reduced. While control response was not as fast as a helicopter with a swashplate, it was still acceptable for all flight conditions. - -{% include youtube.html id='M2seHrdyMqY' %} -

Video 6. Flight performance of the improved rotor

- -After the helicopter was tuned to achieve flight, its ability to autorotate was investigated. This involved piloting the aircraft to a large altitude and shutting off the motor. As expected, the aircraft transitioned smoothly into autorotation. The rotor kept spinning and the aircraft settled into a steady-state descent. Unfortunately, friction from the motor caused the fuselage to rotate during autorotation. The tail rotor could not stop the rotation as it could only apply force in one direction. - -{% include youtube.html id='kZA_8MvSCww' %} -

Video 7. Demonstration of auto-rotation

- -Given this behavior, future iterations of the aircraft should include a large vertical stabilizer. While this will not prevent the aircraft from rotating in vertical descent, it will stop the rotation with modest forward velocity. This is beneficial as the additional airspeed will decrease the descent rate. diff --git a/_collections/projects/Weight Shift Helicopters/_posts/2017-07-01-heli_flight_controller.md b/_collections/projects/Weight Shift Helicopters/_posts/2017-07-01-heli_flight_controller.md deleted file mode 100755 index 772f0b8..0000000 --- a/_collections/projects/Weight Shift Helicopters/_posts/2017-07-01-heli_flight_controller.md +++ /dev/null @@ -1,114 +0,0 @@ ---- -layout: post -title: "Flight controller for a weight-shift RC helicopter" ---- - -# Introduction to concept - -Helicopters are naturally unstable aircraft. Without a system to augment their stability they will inevitably spiral towards the ground. Thankfully, theres a few ways to enhance their stability. A classic approach is to use a heavy bar placed at an angle relative to the rotor blades. Such a -system is known as a flybar, stabilizer-bar, or mechanical gyro. - -![image](https://www.rchelicopterfun.com/images/HillerHead500pics.gif) -[See: Bell-Hiller mixing]() - -This system works by exploiting the angular momentum of the bar. When disturbed, the bar will tend to stay rotating about its current plane. This "resistance" to changes in orientation can fed to the rotor blades to damp the rotation. There are many examples of this stabilization system, be it in large manned helicopters or in small radio-controlled models. Here is a video of what the bar's motion looks like on a small rc-helicopter: - -{% include youtube.html id='1fi3qSU-d1o' %} - -For helicopters with more than two blades, the bar transforms into a star-shaped object or a ring. - -![image](https://www.aviastar.org/foto/lok_xh-51.gif) -[See: Lockheed XH-51](https://www.aviastar.org/helicopters_eng/lok_xh-51.php) - -![image](https://www.aviastar.org/foto/lok_cl-475.gif) -[See: Lockheed CL-475](https://sites.google.com/site/stingrayslistofrotorcraft/lockheed-cl-475) - -While this system works, it comes at the cost of increased mechanical complexity. One can side-step this issue by using electronics to provide analogous control inputs. This greatly simplifies the rotor head but it transfers the complexity to an electronic circuit. With the onset of cheap microcontrollers, this complexity can be abstracted away and emphasis can be placed on the control algorithm. - -# Project overview - -This project concerns itself with the development of a simple and lightweight flight controller for an RC helicopter. To keep things simple, it will use an [Arduino Nano](https://store.arduino.cc/products/arduino-nano) as a development board. It only weighs around 5 grams and is just a few centimeters in length so its an ideal platform. It will also use the [MPU-6050 gyroscope/accelerometer](https://create.arduino.cc/projecthub/CiferTech/what-is-mpu6050-b3b178) to measure the state of the aircraft. This sensor is ubiquous and inexpensive. - -# Stabilization Algorithm - -The pitch and roll axes of the helicopter can be stabilized by means of two [PID Controllers](https://en.wikipedia.org/wiki/PID_controller). The angular velocity, as measured by a gyroscope, acts as the proportional term of the control loops. By taking time integral of this value, one obtains the angular deflection of the aircraft. Hence, the proportional term will act like a viscous damper, while the integral term will act like a spring. -The derivative term would represent the angular acceleration of the aircraft, although in practice may be used to smoothen in the proportional term. - -![image](https://cdn.instrumentationtools.com/wp-content/uploads/2018/01/PID-Controller-Responses-to-Two-momentary-step-inputs.png) - -The yaw axis is different as it is affected by the torque generated by the rotor, and this in turn depends on the configuration of the helicopter. For an aircraft with a tail rotor, the yaw axis can use a PID controller along with a counter-torque term that increases with throttle. This is known as [revo mixing](https://helihack.co.uk/revomixing). - -These corrections can improve the short-term stability of a helicopter, but their effect on long-term stability is less clear. Nonetheless, it is not critical that the aircraft finds an upright attitude on its own. It can still be unstable so long it occurs slowly. This way the pilot can provide nessesary corrections and the helicopter can remain aloft. - -# Design iterations -__Iteration 1:__ -The first version of the helicopter did not have augmented stability. Rather, the focus was on building an aircraft capable of flight and then improving its stability electronically. To this end, the aircraft used very heavy tip weights at the ends of the blades to dampen its rotation. While this worked, it caused the pitch and roll control to have a large delay. This slow response was not very detrimental in high-speed flight, but it did make the aircraft challenging to fly in a hover. Moreover, the tip weights did not enhance the long-term stability of the helicopter. All they did was slow down the motion so that a person could correct the instability. - -{% include youtube.html id='z77q4AkcPiY' %} -

Video 1. Passive stability

- -![image](/img/heli_controller/heli-v1-nostab.JPG) -

Initial airframe with heavy tip weights

- -__Iteration 2:__ -The second iteration of the controller focused on implementing the basic functions needed for the device to work. These were divided into three categories: -- The PWM signals sent by the receiver could be decoded accurately and without delay. -- Information from the gyroscope could be retrieved and calibrated consistently. -- Each axis had a corresponding PID controller that combined the receiver and gyroscope signals. - -While these functions were programmed succesfully, in practice it became evident that vibrations were a serious problem. The gyroscope was sensitive to the slightest disturbances, so any vibrations were measured by the sensor. As the PID controller amplified these signals, the noise would cause the controls of the helicopter to jitter. This made it impossible to make the gains large enough to achieve stable flight, as vibrations overshadowed the slower rotation of the vehicle. - -To overcome this problem, a [simple first order low pass filter](http://www.tsdconseil.fr/tutos/tuto-iir1-en.pdf) was used to suppress the vibration noise. While this helped, it did not provide sufficient suppression. A straight forward, albeit naive, solution was to [cascade multiple 1rst order filters](https://2n3904blog.com/cascading-single-pole-filters/). This increased the noise suppression but came at the cost of a larger response delay. - -![image](https://wiki.analog.com/_media/university/courses/alm1k/circuits1/cascade_rc_sim.png?w=600&tok=694820) -[See: Cascaded filters](https://wiki.analog.com/university/labs/cascaded_rc_adalm2000) - -Unfortunately, this lag caused the PID controller to become unstable as they would not react in synch with the aircraft. This was especially noticeable with the proportional term. Therefore, tuning the filters became a compromise between noise supression and PID stability. After a lot tweaking it was possible to obtain a compromise between filter gain and PID gains. While it worked, the results were generally unsatisfactory as it left the helicopter marginally stable. - -{% include youtube.html id='qZ7qUPAXkvc' %} -

Video 2. Cascaded 1rst order filters

- -![image](/img/heli_controller/heli-v2-wires.JPG) -

Helicopter with Arduino nano and MPU-6050 gyro

- -__Iteration 3:__ -The third iteration focused on improving the low pass filter. It was critical to increase the filter order without increasing the delay. A digital [infinite impulse response filter](https://en.wikipedia.org/wiki/Infinite_impulse_response) was a simple way to achieve this. These filters are nothing more than the [sum of past signal values multiplied by coefficients](https://ccrma.stanford.edu/~jos/filters/Difference_Equation.html). Since the coefficients are hard to calculate, the [Iowa Hills IIR filter designer](https://web.archive.org/web/20201112004255/http://www.iowahills.com/5FIRFiltersPage.html) was used to find the values. The coefficients were then copied into the arduino code. Since the code used arrays to store the coefficients and signal values, it was trivial to try out different configurations. - -The filter performed best when configured as a [Chebychev filter](https://web.archive.org/web/20200706034508/http://www.iowahills.com/IIRChebyshevFilters.html). This provided the best compromise between noise suppression and reponse delay. The step response was very underdamped but it didn't seem to matter. Since the helicopter rotated slowly and smoothly, the ringing was too small to be noticeable. - -![image](https://build.openmodelica.org/Documentation/Modelica_LinearSystems2%202.3.2/Resources/Images/LowPassOrder4FiltersStepResponse.png) - -Whatever the IIR configuration, the results were much better than with cascaded 1rst order filters. The noise suppression was stronger and the signal delay was lower. This allowed the PID gains to increase and made aircraft much more stable and easier to fly. - -{% include youtube.html id='zrrgVdPAhFI' %} -

Video 3. Infinite Impulse Reponse filter

- -__Iteration 4:__ -The forth iteration removed the IIR filter and enabled the [in-built low-pass filter of the MPU-6050](https://deepbluembedded.com/mpu6050-with-microchip-pic-accelerometer-gyroscope-interfacing-with-pic/). This required configuring specific [registers](https://stackoverflow.com/questions/45655256/activting-low-pass-filter-on-mpu6050#45655539). It was trivial since this was already needed for the gyro to communicate with the arduino. At it's lowest setting the filter performed better than any of the hand-coded filters. Like before, this allowed the PID gains to increase and improved stability. - -To complement the filter, the helicopter was adjusted to reduce mechanical vibrations. Rubber grommets were added to the control linkages to remove slop, and a skid was added to the tail boom to prevent vibration. This last tweak is subtle as it worked by increasing the moment of inertia of the entire tail boom. This changed the [resonant frequency](http://facstaff.cbu.edu/~pshiue/Courses/ME318/Notes/Lecture17.pdf) of the boom and shifted it past the frequencies caused by the tail motor. As a result, the amplitude of the vibrations were greatly reduced. - -{% include youtube.html id='nHYoC72DZKo' %} -

Video 4. Inbuilt low-pass filter

- -Below is the third version of the helicopter along with improved flight controller: - -![image](https://raw.githubusercontent.com/RCmags/HeliFlightController/main//example_pictures/front_view_res.JPG) -

Overview of the helicopter

- -![image](https://raw.githubusercontent.com/RCmags/HeliFlightController/main//example_pictures/arduino_view_res.JPG) -

Closeup of the flight controller

- -![image](/img/heli_controller/main_rotor.JPG) -

Rotor with rubber grommets

- -![image](/img/heli_controller/tail_rotor.JPG) -

Tail rotor and heavy skid

- -# Arduino Code -The code was designed to receive 4 PWM inputs from an RC receiver operating in MODE 2 and output 3 PWM signals. Two signals go to the cyclic servos and the third goes to a tail-servo or a speed controller. Since it is assumed only two servo motors are used for controlling the rotor, only a [90-degree swashplate](https://www.rchelicopterfun.com/ccpm.html) is supported. See the schematic for the tail-motor variant of the required circuit: - -![image](https://raw.githubusercontent.com/RCmags/HeliFlightController/main/heli_flight_control_schem.png) - -__Github Repo__: -[HeliFlightController](https://github.com/RCmags/HeliFlightController) diff --git a/_sass/minima/_layout.scss b/_sass/minima/_layout.scss index 1f3860f..48951ae 100755 --- a/_sass/minima/_layout.scss +++ b/_sass/minima/_layout.scss @@ -250,6 +250,10 @@ } } +.class-header { + padding-bottom: 20px; +} + /** * Page header */ diff --git a/_sass/projects.scss b/_sass/projects.scss index 0e8fe3a..dbde809 100755 --- a/_sass/projects.scss +++ b/_sass/projects.scss @@ -14,7 +14,7 @@ .supra_category { font-size: 22px; - color: black; + color: gray; text-align: left; } @@ -26,7 +26,7 @@ } .list_category { - padding-bottom: 40px; + padding-bottom: 20px; } summary { @@ -74,7 +74,8 @@ margin-bottom: 6px; margin-right: 10px; margin-left: 12px; - border-bottom: 1px solid LightGray; + //border-bottom: 1px solid LightGray; + border-bottom: none; } .forlast {