arm-none-eabi-gdb and Python 3.8 issue

In this post, I’m going to show, how to fix an issue with arm-none-eabi-gdb from ARM GNU Toolchain, and old Python 3.8 or Python 3.6 dependencies

Not a long time ago, I’ve updated my home computer with fresh Xubintu 24.04 LTS, so I need to reinstall/resetup my develop enviroment for STM32

If you had an experience with installation of ARM GNU Toolchain on Linux, I guess you also had a painfull experience with ancient and non-working installation instruction for Linux provided by ARM. In general, installtion procedure is quite simple: just unpack an archive, than add «bin» directory into PATH variable.

But! The main issue is a GDB binary with python-based TUI (terminal user interface). It is linked with the old Python 3.8 library, and legacy (plus removed in fresh distros) libncurses5 library.

On the previous Xubuntu 22.04, I’ve used a solution with a custom repository, but for the current Xubintu 24.04 Python 3.8 doesn’t exist, and libncurses5 package has been removed from repositories. How can we solve this problem?

After a litte search, I’ve found a suitable solution on StackOverflow. Just build your own GDB with actual Python for you system! It is quite simple!

I’ve checked this instruction, and did a small change in the tutorial: replaced final «make install» command on a deb-file generation, because simple «make install» just copies compiled binary and other files into your system directories without any control. Please, DON’T DO IT on modern repository-based Linux systems! All software MUST BE installed using a system package manger.

OK. Let’s installation begin! I’m going to do all my action in «/storage/Temp» directory.

Part I. GDB compilation

At first, let’s install all required packages for a compilation

$ sudo apt-get install -y build-essential libz-dev libexpat1-dev libncurses-dev libgmp-dev libmpfr-dev libisl-dev libreadline-dev libpython3-dev texinfo texlive

Then, fetch fresh sources for GDB

$ wget https://ftp.gnu.org/gnu/gdb/gdb-14.2.tar.xz

Unpack it

$ tar Jxf gdb-14.2.tar.xz

Create a directory for compilation

$ mkdir gdb-build

And the directories for a future package’s tree

$ mkdir arm-none-eabi-gdb
$ mkdir arm-none-eabi-gdb/usr

Move to the build directory

$ cd gdb-build

And run pre-configuration. Please mention «—prefix» option. It points on our «package’s tree» dir

$ ../gdb-14.2/configure --with-expat --target=arm-none-eabi --program-prefix=arm-none-eabi- --with-source-highlight --with-python=$(which python3) --enable-tui --prefix=/storage/Temp/arm-none-eabi-gdb/usr

Run compilation process

$ make -j8 all

And finally, make an «installation»

$ make install

Well, let’s check what we have in our installation dir

$ cd /storage/Temp/arm-none-eabi-gdb/usr/bin/
$ ls

arm-none-eabi-gdb  arm-none-eabi-gdb-add-index  arm-none-eabi-run

Great! We have «arm-none-eabi-gdb» binary. But we have to check, which kind of libraries linked to our binary.

$ ldd arm-none-eabi-gdb

	linux-vdso.so.1 (0x00007ffff49cd000)
	libncursesw.so.6 => /lib/x86_64-linux-gnu/libncursesw.so.6 (0x0000796ab03c4000)
	libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x0000796ab0390000)
	libpython3.12.so.1.0 => /lib/x86_64-linux-gnu/libpython3.12.so.1.0 (0x0000796aafa00000)
	libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x0000796ab0365000)
	libmpfr.so.6 => /lib/x86_64-linux-gnu/libmpfr.so.6 (0x0000796ab02aa000)
	libgmp.so.10 => /lib/x86_64-linux-gnu/libgmp.so.10 (0x0000796aaf97c000)
	libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x0000796aaf600000)
	libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x0000796aaf893000)
	libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x0000796aaf5d3000)
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x0000796aaf200000)
	libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x0000796aaf5b7000)
	/lib64/ld-linux-x86-64.so.2 (0x0000796ab0e0e000)

Success! Our custom GDB binary linked with the fresh system Python, and libncurses libraries! Save this command output, it will be usefull for future steps.

Part II. Build custom «deb» package file

Now we can build our custom «deb» package for the installation.

$ cd /storage/Temp/arm-none-eabi-gdb/
$ mkdir DEBIAN && cd DEBIAN
$ nano control

Add follwing text into «control» file

Package: arm-none-eabi-gdb
Version: 4.12
Maintainer: Igor Volodin
Architecture: amd64
Depends: libc6, zlib1g, libgcc-s1, libstdc++6, libgmp10, libmpfr6, libexpat1, libpython3-stdlib, libtinfo6, libncurses6, libncursesw6          
Description: GDB for ARM with Python TUI

Also, I have to mention, how to collect a list of packages for the «Depends» option. Look at the output of «ldd» command. It contains list of required shared libraries. Just get the library name from the output (for example, I will use «libexpat»), and find similar in the installed packages.

$ dpkg -l | grep libexpat

ii  libexpat1:amd64                                2.6.1-2build1                             amd64        XML parsing C library - runtime library
ii  libexpat1-dev:amd64                            2.6.1-2build1                             amd64        XML parsing C library - development kit

OK, we have «libexpat1» and «libexpat1-dev». The second is just for compilation from sources, and not needed for the our binary package. Re-check our choice, by listing all files, related to the «libexpat1» package. Yes, it includes /usr/lib/x86_64-linux-gnu/libexpat.so.1 file, so we can add «libexpat1» into «Depends» section.

$ dpkg -L libexpat1

/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1
/usr/lib/x86_64-linux-gnu/libexpatw.so.1.9.1
/usr/share
/usr/share/doc
/usr/share/doc/libexpat1
/usr/share/doc/libexpat1/AUTHORS
/usr/share/doc/libexpat1/changelog.Debian.gz
/usr/share/doc/libexpat1/copyright
/usr/lib/x86_64-linux-gnu/libexpat.so.1
/usr/lib/x86_64-linux-gnu/libexpatw.so.1

Right now we have a «package installation tree» in «/storage/Temp/arm-none-eabi-gdb» directory. And on this step, better to check, have we intersections with already installed files in our system, or not. Our package tree has «gdb» directory in /storage/Temp/arm-none-eabi-gdb/usr/share/. And it contains something.

$ ls /storage/Temp/arm-none-eabi-gdb/usr/share/gdb

python  syscalls  system-gdbinit

But our current system directory also has same directory and files in /usr/share/!

$  ls /usr/share/gdb/

auto-load  python  syscalls  system-gdbinit

Unfortunallty, I don’t know, how package mainteiner have to resolve similar issues. I’ve removed confilcting directories and files form «package installation tree»

$ rm -rf /storage/Temp/arm-none-eabi-gdb/usr/share/gdb /storage/Temp/arm-none-eabi-gdb/usr/include/gdb

Well, it is time to build the package. Move to the top directory

$ cd /storage/Temp/

And build the package

$ dpkg-deb --build arm-none-eabi-gdb

dpkg-deb: building package 'arm-none-eabi-gdb' in 'arm-none-eabi-gdb.deb'.

Recheck what the package contains

$ dpkg -c arm-none-eabi-gdb.deb
drwxrwxr-x igor/igor         0 2024-06-19 21:25 ./
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/bin/
-rwxr-xr-x igor/igor 163716584 2024-06-19 21:16 ./usr/bin/arm-none-eabi-gdb
-rwxr-xr-x igor/igor      4627 2024-06-19 21:16 ./usr/bin/arm-none-eabi-gdb-add-index
-rwxr-xr-x igor/igor   8545496 2024-06-19 21:16 ./usr/bin/arm-none-eabi-run
drwxrwxr-x igor/igor         0 2024-06-19 23:19 ./usr/include/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/include/sim/
-rw-r--r-- igor/igor     12471 2024-06-19 21:16 ./usr/include/sim/callback.h
-rw-r--r-- igor/igor      9969 2024-06-19 21:16 ./usr/include/sim/sim.h
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/lib/
-rw-r--r-- igor/igor   9277172 2024-06-19 21:16 ./usr/lib/libarm-none-eabi-sim.a
drwxrwxr-x igor/igor         0 2024-06-19 21:46 ./usr/share/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/doc/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/doc/arm/
-rw-r--r-- igor/igor       779 2024-06-19 21:16 ./usr/share/doc/arm/README
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/info/
-rw-r--r-- igor/igor     48920 2024-06-19 21:16 ./usr/share/info/annotate.info
-rw-r--r-- igor/igor    698473 2024-06-19 21:16 ./usr/share/info/bfd.info
-rw-r--r-- igor/igor     90873 2024-06-19 21:16 ./usr/share/info/ctf-spec.info
-rw-rw-r-- igor/igor       990 2024-06-19 21:16 ./usr/share/info/dir
-rw-r--r-- igor/igor     29050 2024-06-19 21:16 ./usr/share/info/gdb.info
-rw-r--r-- igor/igor    301325 2024-06-19 21:16 ./usr/share/info/gdb.info-1
-rw-r--r-- igor/igor    300368 2024-06-19 21:16 ./usr/share/info/gdb.info-2
-rw-r--r-- igor/igor    302491 2024-06-19 21:16 ./usr/share/info/gdb.info-3
-rw-r--r-- igor/igor    308967 2024-06-19 21:16 ./usr/share/info/gdb.info-4
-rw-r--r-- igor/igor    287286 2024-06-19 21:16 ./usr/share/info/gdb.info-5
-rw-r--r-- igor/igor    299564 2024-06-19 21:16 ./usr/share/info/gdb.info-6
-rw-r--r-- igor/igor    302126 2024-06-19 21:16 ./usr/share/info/gdb.info-7
-rw-r--r-- igor/igor    384849 2024-06-19 21:16 ./usr/share/info/gdb.info-8
-rw-r--r-- igor/igor    249330 2024-06-19 21:16 ./usr/share/info/gdb.info-9
-rw-r--r-- igor/igor     29825 2024-06-19 21:16 ./usr/share/info/sframe-spec.info
-rw-r--r-- igor/igor    184719 2024-06-19 21:16 ./usr/share/info/stabs.info
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/da/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/da/LC_MESSAGES/
-rw-r--r-- igor/igor    153602 2024-06-19 21:16 ./usr/share/locale/da/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     17551 2024-06-19 21:16 ./usr/share/locale/da/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/de/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/de/LC_MESSAGES/
-rw-r--r-- igor/igor     54340 2024-06-19 21:16 ./usr/share/locale/de/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/es/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/es/LC_MESSAGES/
-rw-r--r-- igor/igor    208584 2024-06-19 21:16 ./usr/share/locale/es/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     39868 2024-06-19 21:16 ./usr/share/locale/es/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fi/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fi/LC_MESSAGES/
-rw-r--r-- igor/igor    162673 2024-06-19 21:16 ./usr/share/locale/fi/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     31220 2024-06-19 21:16 ./usr/share/locale/fi/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/fr/LC_MESSAGES/
-rw-r--r-- igor/igor    239357 2024-06-19 21:16 ./usr/share/locale/fr/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     57025 2024-06-19 21:16 ./usr/share/locale/fr/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ga/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ga/LC_MESSAGES/
-rw-r--r-- igor/igor     30700 2024-06-19 21:16 ./usr/share/locale/ga/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/hr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/hr/LC_MESSAGES/
-rw-r--r-- igor/igor      5144 2024-06-19 21:16 ./usr/share/locale/hr/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/id/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/id/LC_MESSAGES/
-rw-r--r-- igor/igor    144237 2024-06-19 21:16 ./usr/share/locale/id/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     30272 2024-06-19 21:16 ./usr/share/locale/id/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/it/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/it/LC_MESSAGES/
-rw-r--r-- igor/igor     26349 2024-06-19 21:16 ./usr/share/locale/it/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ja/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ja/LC_MESSAGES/
-rw-r--r-- igor/igor    134646 2024-06-19 21:16 ./usr/share/locale/ja/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ka/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ka/LC_MESSAGES/
-rw-r--r-- igor/igor      4993 2024-06-19 21:16 ./usr/share/locale/ka/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/nl/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/nl/LC_MESSAGES/
-rw-r--r-- igor/igor     25259 2024-06-19 21:16 ./usr/share/locale/nl/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt/LC_MESSAGES/
-rw-r--r-- igor/igor    218318 2024-06-19 21:16 ./usr/share/locale/pt/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt_BR/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/pt_BR/LC_MESSAGES/
-rw-r--r-- igor/igor     56398 2024-06-19 21:16 ./usr/share/locale/pt_BR/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ro/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ro/LC_MESSAGES/
-rw-r--r-- igor/igor    238628 2024-06-19 21:16 ./usr/share/locale/ro/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     56150 2024-06-19 21:16 ./usr/share/locale/ro/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ru/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/ru/LC_MESSAGES/
-rw-r--r-- igor/igor    292997 2024-06-19 21:16 ./usr/share/locale/ru/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/rw/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/rw/LC_MESSAGES/
-rw-r--r-- igor/igor       388 2024-06-19 21:16 ./usr/share/locale/rw/LC_MESSAGES/bfd.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sr/LC_MESSAGES/
-rw-r--r-- igor/igor    292730 2024-06-19 21:16 ./usr/share/locale/sr/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     67410 2024-06-19 21:16 ./usr/share/locale/sr/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sv/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/sv/LC_MESSAGES/
-rw-r--r-- igor/igor    155219 2024-06-19 21:16 ./usr/share/locale/sv/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     55522 2024-06-19 21:16 ./usr/share/locale/sv/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/tr/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/tr/LC_MESSAGES/
-rw-r--r-- igor/igor     69552 2024-06-19 21:16 ./usr/share/locale/tr/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     16117 2024-06-19 21:16 ./usr/share/locale/tr/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/uk/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/uk/LC_MESSAGES/
-rw-r--r-- igor/igor    299719 2024-06-19 21:16 ./usr/share/locale/uk/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     70903 2024-06-19 21:16 ./usr/share/locale/uk/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/vi/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/vi/LC_MESSAGES/
-rw-r--r-- igor/igor    160341 2024-06-19 21:16 ./usr/share/locale/vi/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     33633 2024-06-19 21:16 ./usr/share/locale/vi/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/zh_CN/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/locale/zh_CN/LC_MESSAGES/
-rw-r--r-- igor/igor     17866 2024-06-19 21:16 ./usr/share/locale/zh_CN/LC_MESSAGES/bfd.mo
-rw-r--r-- igor/igor     20533 2024-06-19 21:16 ./usr/share/locale/zh_CN/LC_MESSAGES/opcodes.mo
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/man/
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/man/man1/
-rw-r--r-- igor/igor      6536 2024-06-19 21:16 ./usr/share/man/man1/arm-none-eabi-gdb-add-index.1
-rw-r--r-- igor/igor     16840 2024-06-19 21:16 ./usr/share/man/man1/arm-none-eabi-gdb.1
-rw-r--r-- igor/igor     14121 2024-06-19 21:16 ./usr/share/man/man1/arm-none-eabi-gdbserver.1
drwxrwxr-x igor/igor         0 2024-06-19 21:16 ./usr/share/man/man5/
-rw-r--r-- igor/igor      7873 2024-06-19 21:16 ./usr/share/man/man5/arm-none-eabi-gdbinit.5

Now, we can install it using dpkg

$ sudo dpkg -i arm-none-eabi-gdb.deb

Check it

$ sudo dpkg -l | grep arm-none
ii  arm-none-eabi-gdb  4.12     amd64        GDB for ARM with Python TUI

$ which arm-none-eabi-gdb

/usr/bin/arm-none-eabi-gdb

Повесть о датчиках углекислого газа (MH-Z19 & DS-CO2)

Еще в прошлом году я увидел на канале Дмитрия Коржевского, как он создавал монитор содержания углекислого газа в воздухе. И эта тема меня заинтересовала. Поскольку здесь, в Вильнюсе, я работаю из дома, плюс у меня комната-студия, и вентиляция в моем новом доме ну о-о-очень странная задуматься о содержании углекислого газа в помещении это хорошая идея.

Читать далее «Повесть о датчиках углекислого газа (MH-Z19 & DS-CO2)»

Изготовление печатных плат лазером. Успех.

Сегодня я предприял еще одну попытку подобрать режим работы лазера для изготовления печатных плат.

Краткое резюме:

  • Игры с режимами движения лазера в LaserGRBL не принесли успеха. Траектория движения лазера получается какая-то хаотичная, и некоторые прямые дорожки на плате превращаются в непонятно что. Вероятно для выжигания рисунков это не критично, а для изготовления плат — да.
  • Попытка наклеить скотч на покращенную плату — полный провал. На малой мощности лазер просто просвечивает скотч, на большой — оплавляет его грубо.
  • Попытка поменять мощность — успех.
    Ниже фото плат, дорожки кототорых выжигались на покрытой черной аэрозольной краской поверхности. Изображение было в PNG. Алгоритм движения лазера — «влево-вправо». Травление производилось в растворе «перекись водорода 5% + лимонная кислота + соль».
Выжигание синим лазером 2W, мощность 60%
Выжигание синим лазером 2W, мощность 60%

Мощность 60%. Дорожки толщиной 0.1 мм частично разъедены. Дорожки 0.2 немного отличаются по толщине. Ширина падов микросхемы отличается незначительно.

Выжигание синим лазером 2W, мощность 50%
Выжигание синим лазером 2W, мощность 50%

Мощность 50%. Дорожки 0.1 мм присутсвуют, но на их границах имеются следы недотрава, и сами линии неравномерные по ширине. Дорожки 0.2 почти не отличаются. Так же почти не отличаются пады микросхемы.

Выжигание синим лазером 2W, мощность 40%
Выжигание синим лазером 2W, мощность 40%

Мощность 40%. Непротравов нет. Почти все линии имеют стабильную ширину.

Выжигание синим лазером 2W, мощность 30%
Выжигание синим лазером 2W, мощность 30%

Мощность 30%. Ширина дорожек стабильна везде. Результат на твердую четверку.

Далее я попробую понизить мощность лазера еще, ради любопытства. Но то что я достиг сегодня — это значитальный успех. Ранее, с лазерно-утюжной технологией, для меня дорожки толщиной 0.3 мм были уже проблемой, а дорожки 0.1 мм — недостижимой мечтой. Когда мне нужна была такая точность — я заказывал платы в Китае. А теперь — получите и распишитесь. 🙂

Определенно, прототипирование пойдет веселее, быстрее и дешевле.

Лазерно-утюжная технология. Теперь на 100% меньше утюга

В связи с релокацией, весь этот год я либо не мог, либо мог, но с помощью молотка и зубила делать платы для прототипирования и отладки схем. Всю свою сознательную жизнь я использовал технологию «лазерного утюга». Но в текущей ситуации, покупка лазерного принтера, только для изготовления печатных плат, смысла явно не имеет.

И было принято решение — сделать шаг вперед, и приобрести устройство, которое будет меньше, будет позволять делать платы с более тонкими дорожками, и будет производить меньше отходов, и требовать меньше технологических шагов. И имя этому устройству — лазерный гравер.

О постройке лазерного станка я задумывался уже давно. Игрался со примитивной схемой «две каретки от DVD + лазер из пишущего привода», потом прикупил синий лазер на 2 Вт. Потом охлаждение. Затем драйвер. Но все эти запчасти валялись в коробке на полке, и желания что-то делать не возникало. Зачем? Есть же МФУ рядом со столом, и пачка фотобумаги в столе. Все и так хорошо. (все же попытка изменить технологию была, поскольку дырки в платах надо было сверлить, и я купил ЧПУ фрезер. Но столкнулся с вибрацией вала шпинделя, ломавшей тонкие фрезы, диким шумом и пылью от текстолита. Короче — не пошло)

А в текущей ситуации, бродячий самурай вспомнил о изготовлении плат при помощи лазера. Берем текстолит. Наносим либо фоторезист, либо негативную маску. Проходим лазером, рисуя плату. Смывем фоторезист, либо если плату просто покрыл краской — то сразу в травильный раствор. И радуемся жизни.

В первую очередь мне нужен был станок. Сначла в моей голове бродили мысли собрать его из деталей самому. Но! С определенного момента, я начал стараться искоренять в себе «кулибинство», требующее делать все самому. Ибо я понял что этот подход хоть и приятен, создает ощущение важности дела, но! Проект растягивается, забрасывается, откладывается, теряется интерес… И вот у нас целый стеллаж недоделаных проектов. Нафиг это. Поэтоу иногда надо взять волю в кулак, и как взрослый человек расстегнуть кошелек. 🙂 И купить нужные вещи.

Читать далее «Лазерно-утюжная технология. Теперь на 100% меньше утюга»

Антенна для Саткома

Достаточно давно, я собирал себе антенну на сатком, но довольно быстро она была закинута в дальний угол (это была «satcom turnstyle antenna» с фазосогласующей цепью, картинка которой бродит по интернету лет 10 уже), поскольку небыло постоянного места для её установки.

В данный момент, я хоть и не в своем доме, забрасывать антенные дела не собираюсь. Пора обеспечить себя антенным хозяйством!

За исходный вариант была взята 5 элементная яги от Radius’а

Я достал из дальнего угла MMana и перенес размеры яги для трубки в 6 мм.

Анализ показал следующее:

У автора расчет был выполнен под диаметры 6 и 5.3 миллиметра. А у меня в ближайшем строительном магазине водились алюминиевые трубки диаметром 8 мм. Надо пересчитать.

Задал радиус элеметов равным 4 мм, и до кучи по услышанному где-то на ютубе совету, добавил расчет один лишний элемент нулевого радиуса. Оптимизатору в MMANA установил приоритетом частоты 300 и 260 Мгц, и запустил подборку параметров.

MMANA насчитала вот такое:

Теперь берем волшебную палочку и машем пилу по металлу, дрель и 3д-принтер и превращеем чертеж в реальность. В процессе создания антенны, я разработал набор конструкционных элементов, позволяющих быстро создавать яги, и прикрепляться к различным трубкам. Но об этом я раскажу более подробно потом. Пока могу сказать, что мой 3д принтер славно потрудился несколько дней.

Voilà!

Дрожащими руками берем NanoVNA, и смотрим насколько наши желания совпадают с действительностью.

Капельку не попали. Но! Примерно нужные частоты находятся в районе КСВ 1.0 — 1.5. И это хорошо! Пока пусть работает так, потом я поиграю с размерами еще. Ну и попробую превратить ее в crossed-yagi.

Блок питания трансиверов

Шарясь вчера на eBay, в поисках чего-нибудь, на что можно выкинуть еще денег, я вспомнил про трансивер QMAC HF90, и решил поглядеть, не продает ли кто-нибудь сломаный по-дешёвке, дабы его оживить и сэкономить.

И нашел вот такие потроха в Испании, за 49 долларов (+30 доставка 🙂 )

Несчастный трансивер кто-то долго пытал паяльником, и франкенштейнезировал. Но видимо безуспешно. Я погуглил схему на него, и внезапно нашел. Судя по ней, я обнаружил что помимо мордочки (которая была у продавца), была еще плата фильтров и питания. Я мысленно забил на возможность оживления трупа за такую цену (да и иных проектов у меня, как видно по списку, хоть отбавляй) и начал разглядывать как сделан этот малыш.

Из интересного — я обнаружил что в качестве транзисторов в выходном усилителе мощности используются не какие-нибудь Mitsubisi RD16HHF1, как можно подумать, а пара забубенных switching транзисторов IRF830 !

Вот что называется «дешево и сердио!» (хотя по поводу дешевизны рабочего трансивера можно поспорить, хе-хе). Данную схему я взял на заметку, как-нибудь проведу тесты.

Далее мой взор упал на блок питания, и тут тоже есть что экспроприировать.

Блок питания их 10-28 вольт создает 5, 10, 15, и 50 вольт. 10 и 50 мне в моих трансиверах не нужны, а вот 5 и 15 пригодятся.

В целом, схема этого трансивера источник интересных идей.

Штучки для измерения

Поскольку я выделил 150 евро на покупку спектроанализатора TinySA Ultra, негоже будет его случайно спалить в процессе экспериментов.

Так что приобрел себе аттенюатор на 40 децибелл. Надо будет еще всяким мелким закупиться, на 5-10 децибел, но на ватт — пол-ватта.

FreeCAD Optics и самодельная оффсетная спутниковая антенна.

Разглядывая канал dereksgc, а особенно имеющуюся у него здоровенную спутниковую антенну, захотел чего-то подобного. Но увы в текущей ситуации я не могу отгрохать нечто подобное у себя во дворе.

Но в голову взбрела идея сконструровать какую-нибудь портативную разбирающуюся спутниковую антенну. Ключевое слово — «разбирающуюся». Именно поэтому был отвергнут самы очевидный путь — купить по дешману спутниковую тарелку от спутникового телевидения, которых как грязи.

Читать далее «FreeCAD Optics и самодельная оффсетная спутниковая антенна.»

Термокомпенсированный генератор 10 Мгц OSC5A2B02

Благодаря видео IMSAI Guy, нашел приличный термокомпенсированный генератор для своих поделок

На нём, я начал собирать себе небольшой частотометр (ибо здоровая лошадь Victor VC3165 занимает дофига места, и не имеет нужных приколюх типа подключения внешнего опорника)

Как-то оно вот так выглядит. Мой частотометр брешет примерно на 10 Гц