{"id":24534,"date":"2026-07-21T02:25:07","date_gmt":"2026-07-21T02:25:07","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24534"},"modified":"2026-07-21T02:25:12","modified_gmt":"2026-07-21T02:25:12","slug":"universal-joint-calculator-2","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/universal-joint-calculator-2\/","title":{"rendered":"\u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043a\u0430\u0440\u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0440\u043d\u0438\u0440\u043e\u0432"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Universal Joint Calculator<\/strong> is a free online engineering tool designed to help engineers, technicians, and machinery designers calculate the operating parameters of universal joints used in power transmission systems. By entering values such as shaft angle, rotational speed, transmitted torque, and shaft dimensions, the <strong>Universal Joint Calculator<\/strong> quickly evaluates performance, operating efficiency, and motion characteristics. It helps users select the appropriate universal joint for automotive, industrial, agricultural, and mechanical applications while minimizing vibration, reducing wear, and improving transmission reliability. Whether you&#8217;re designing a new driveline or optimizing an existing system, this browser-based calculator provides fast, accurate results without requiring additional software, making engineering calculations more efficient and reliable.<\/p>\n\n\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>Universal Joint Angle &amp; Efficiency Calculator<\/title>\n  <style>\n    \/* \u2500\u2500 All styles scoped to .uj-calc \u2014 zero leakage into the host page \u2500\u2500 *\/\n\n    .uj-calc {\n      --uj-bg:           #ffffff;\n      --uj-bg-card:      #ffffff;\n      --uj-bg-input:     #f8fafc;\n      --uj-border:       #d1dbe8;\n      --uj-text:         #1e293b;\n      --uj-text-muted:   #64748b;\n      --uj-accent:       #3b82f6;\n      --uj-accent-hover: #2563eb;\n      --uj-accent-glow:  rgba(59, 130, 246, 0.15);\n      --uj-success:      #22c55e;\n      --uj-warning:      #f59e0b;\n      --uj-caution:      #fb923c;\n      --uj-danger:       #ef4444;\n      --uj-shadow:       0 4px 24px rgba(0, 0, 0, 0.08);\n      --uj-radius:       12px;\n      --uj-transition:   0.2s ease;\n\n      \/* Base reset \u2014 only inside the calculator *\/\n      box-sizing: border-box;\n      max-width: 560px;\n      margin: 0 auto;\n      padding: 1.5rem;\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n      font-size: 16px;\n      line-height: 1.6;\n      color: var(--uj-text);\n      background: var(--uj-bg);\n    }\n\n    .uj-calc *, .uj-calc *::before, .uj-calc *::after {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n    }\n\n    \/* \u2500\u2500 Card \u2500\u2500 *\/\n    .uj-calc .uj-card {\n      background: var(--uj-bg-card);\n      border: 1px solid var(--uj-border);\n      border-radius: var(--uj-radius);\n      padding: 1.25rem;\n      box-shadow: var(--uj-shadow);\n    }\n\n    .uj-calc .uj-card + .uj-card {\n      margin-top: 1.25rem;\n    }\n\n    .uj-calc .uj-card h2 {\n      font-size: 0.75rem;\n      text-transform: uppercase;\n      letter-spacing: 0.08em;\n      color: var(--uj-text-muted);\n      margin-bottom: 1rem;\n      font-weight: 600;\n      line-height: 1.4;\n    }\n\n    \/* \u2500\u2500 Form fields \u2500\u2500 *\/\n    .uj-calc .uj-field {\n      margin-bottom: 1.1rem;\n    }\n\n    .uj-calc .uj-field:last-child {\n      margin-bottom: 0;\n    }\n\n    .uj-calc .uj-field label {\n      display: flex;\n      justify-content: space-between;\n      align-items: baseline;\n      font-size: 0.875rem;\n      font-weight: 500;\n      margin-bottom: 0.45rem;\n      color: var(--uj-text);\n      cursor: default;\n    }\n\n    .uj-calc .uj-field label .uj-badge {\n      font-family: \"SF Mono\", \"Cascadia Code\", \"Consolas\", monospace;\n      font-size: 0.8rem;\n      color: var(--uj-accent);\n      font-weight: 600;\n    }\n\n    .uj-calc input[type=\"number\"],\n    .uj-calc select {\n      width: 100%;\n      padding: 0.6rem 0.75rem;\n      background: var(--uj-bg-input);\n      border: 1px solid var(--uj-border);\n      border-radius: 8px;\n      color: var(--uj-text);\n      font-size: 0.9rem;\n      font-family: inherit;\n      transition: border-color var(--uj-transition), box-shadow var(--uj-transition);\n      appearance: auto;\n      -webkit-appearance: auto;\n    }\n\n    .uj-calc input[type=\"number\"]:focus,\n    .uj-calc select:focus {\n      outline: none;\n      border-color: var(--uj-accent);\n      box-shadow: 0 0 0 3px var(--uj-accent-glow);\n    }\n\n    \/* Slider row *\/\n    .uj-calc .uj-slider-row {\n      display: flex;\n      gap: 0.75rem;\n      align-items: center;\n    }\n\n    .uj-calc .uj-slider-row input[type=\"range\"] {\n      flex: 1;\n      -webkit-appearance: none;\n      appearance: none;\n      height: 6px;\n      border-radius: 999px;\n      background: var(--uj-border);\n      outline: none;\n      cursor: pointer;\n      border: none;\n      padding: 0;\n    }\n\n    .uj-calc .uj-slider-row input[type=\"range\"]::-webkit-slider-thumb {\n      -webkit-appearance: none;\n      width: 18px;\n      height: 18px;\n      border-radius: 50%;\n      background: var(--uj-accent);\n      box-shadow: 0 0 0 3px var(--uj-accent-glow);\n      cursor: pointer;\n      transition: transform var(--uj-transition);\n    }\n\n    .uj-calc .uj-slider-row input[type=\"range\"]::-webkit-slider-thumb:hover {\n      transform: scale(1.15);\n    }\n\n    .uj-calc .uj-slider-row input[type=\"range\"]::-moz-range-thumb {\n      width: 18px;\n      height: 18px;\n      border-radius: 50%;\n      background: var(--uj-accent);\n      border: none;\n      box-shadow: 0 0 0 3px var(--uj-accent-glow);\n      cursor: pointer;\n    }\n\n    .uj-calc .uj-slider-row input[type=\"number\"] {\n      width: 72px;\n      flex-shrink: 0;\n      text-align: center;\n    }\n\n    \/* Power unit toggle *\/\n    .uj-calc .uj-unit-toggle {\n      display: flex;\n      border: 1px solid var(--uj-border);\n      border-radius: 8px;\n      overflow: hidden;\n      margin-bottom: 0.45rem;\n    }\n\n    .uj-calc .uj-unit-toggle button {\n      flex: 1;\n      padding: 0.4rem;\n      background: var(--uj-bg-input);\n      border: none;\n      color: var(--uj-text-muted);\n      font-size: 0.8rem;\n      font-weight: 600;\n      font-family: inherit;\n      cursor: pointer;\n      transition: background var(--uj-transition), color var(--uj-transition);\n      line-height: 1.4;\n    }\n\n    .uj-calc .uj-unit-toggle button.uj-active {\n      background: var(--uj-accent);\n      color: #fff;\n    }\n\n    \/* Friction presets *\/\n    .uj-calc .uj-friction-presets {\n      display: grid;\n      grid-template-columns: repeat(3, 1fr);\n      gap: 0.5rem;\n      margin-bottom: 0.5rem;\n    }\n\n    .uj-calc .uj-friction-presets button {\n      padding: 0.5rem 0.25rem;\n      background: var(--uj-bg-input);\n      border: 1px solid var(--uj-border);\n      border-radius: 8px;\n      color: var(--uj-text-muted);\n      font-size: 0.78rem;\n      font-weight: 600;\n      font-family: inherit;\n      cursor: pointer;\n      transition: all var(--uj-transition);\n      line-height: 1.4;\n    }\n\n    .uj-calc .uj-friction-presets button.uj-active {\n      border-color: var(--uj-accent);\n      background: var(--uj-accent-glow);\n      color: var(--uj-accent);\n    }\n\n    .uj-calc .uj-friction-presets button:hover:not(.uj-active) {\n      border-color: var(--uj-accent);\n    }\n\n    \/* System config toggle *\/\n    .uj-calc .uj-config-toggle {\n      display: grid;\n      grid-template-columns: 1fr 1fr;\n      gap: 0.5rem;\n    }\n\n    .uj-calc .uj-config-toggle label {\n      display: flex;\n      flex-direction: column;\n      align-items: center;\n      gap: 0.35rem;\n      padding: 0.85rem 0.5rem;\n      background: var(--uj-bg-input);\n      border: 2px solid var(--uj-border);\n      border-radius: 10px;\n      cursor: pointer;\n      text-align: center;\n      font-size: 0.82rem;\n      font-weight: 600;\n      color: var(--uj-text-muted);\n      transition: all var(--uj-transition);\n    }\n\n    .uj-calc .uj-config-toggle label .uj-cfg-icon {\n      font-size: 1.5rem;\n      line-height: 1;\n    }\n\n    .uj-calc .uj-config-toggle input[type=\"radio\"] {\n      display: none;\n    }\n\n    .uj-calc .uj-config-toggle input[type=\"radio\"]:checked + label,\n    .uj-calc .uj-config-toggle label:has(input[type=\"radio\"]:checked) {\n      border-color: var(--uj-accent);\n      background: var(--uj-accent-glow);\n      color: var(--uj-accent);\n    }\n\n    \/* Calculate button *\/\n    .uj-calc .uj-btn-calculate {\n      width: 50%;\n      display: block;\n      margin-top: 1.25rem;\n      margin-left: auto;\n      margin-right: auto;\n      padding: 0.75rem 1rem;\n      background: var(--uj-accent);\n      color: #fff;\n      border: none;\n      border-radius: 8px;\n      font-size: 0.95rem;\n      font-weight: 700;\n      font-family: inherit;\n      cursor: pointer;\n      letter-spacing: 0.03em;\n      transition: background var(--uj-transition), box-shadow var(--uj-transition), transform var(--uj-transition);\n      line-height: 1.4;\n    }\n\n    .uj-calc .uj-btn-calculate:hover {\n      background: var(--uj-accent-hover);\n      box-shadow: 0 0 0 3px var(--uj-accent-glow);\n    }\n\n    .uj-calc .uj-btn-calculate:active {\n      transform: scale(0.98);\n    }\n\n    \/* Results section *\/\n    .uj-calc .uj-results {\n      display: none;\n    }\n\n    .uj-calc .uj-results.uj-visible {\n      display: block;\n      animation: uj-fadeIn 0.4s ease;\n    }\n\n    \/* Status banner *\/\n    .uj-calc .uj-status {\n      border-radius: var(--uj-radius);\n      padding: 0.85rem 1.15rem;\n      margin-top: 1.25rem;\n      margin-bottom: 1.25rem;\n      display: flex;\n      align-items: flex-start;\n      gap: 0.75rem;\n      font-size: 0.9rem;\n      font-weight: 500;\n      border: 1px solid transparent;\n      transition: background var(--uj-transition), border-color var(--uj-transition), color var(--uj-transition);\n    }\n\n    .uj-calc .uj-status .uj-status-icon {\n      font-size: 1.25rem;\n      flex-shrink: 0;\n      line-height: 1.4;\n    }\n\n    .uj-calc .uj-status strong {\n      display: block;\n      margin-bottom: 0.1rem;\n    }\n\n    .uj-calc .uj-status.uj-warning { background: rgba(245,158,11,0.12); border-color: rgba(245,158,11,0.35); color: var(--uj-warning); }\n    .uj-calc .uj-status.uj-optimal { background: rgba(34,197,94,0.12);  border-color: rgba(34,197,94,0.35);  color: var(--uj-success); }\n    .uj-calc .uj-status.uj-caution { background: rgba(251,146,60,0.12); border-color: rgba(251,146,60,0.35); color: var(--uj-caution); }\n    .uj-calc .uj-status.uj-danger  { background: rgba(239,68,68,0.12);  border-color: rgba(239,68,68,0.35);  color: var(--uj-danger); }\n\n    \/* Results grid *\/\n    .uj-calc .uj-results-grid {\n      display: grid;\n      grid-template-columns: repeat(2, 1fr);\n      gap: 0.75rem;\n    }\n\n    @media (max-width: 480px) {\n      .uj-calc .uj-results-grid { grid-template-columns: 1fr; }\n    }\n\n    .uj-calc .uj-metric {\n      background: var(--uj-bg-input);\n      border: 1px solid var(--uj-border);\n      border-radius: 10px;\n      padding: 0.85rem 1rem;\n      transition: transform var(--uj-transition), box-shadow var(--uj-transition);\n    }\n\n    .uj-calc .uj-metric:hover {\n      transform: translateY(-2px);\n      box-shadow: var(--uj-shadow);\n    }\n\n    .uj-calc .uj-metric.uj-featured {\n      grid-column: 1 \/ -1;\n      display: flex;\n      align-items: center;\n      justify-content: space-between;\n      gap: 1rem;\n      border-color: var(--uj-accent);\n      background: var(--uj-accent-glow);\n    }\n\n    .uj-calc .uj-metric-label {\n      font-size: 0.72rem;\n      text-transform: uppercase;\n      letter-spacing: 0.06em;\n      color: var(--uj-text-muted);\n      font-weight: 600;\n    }\n\n    .uj-calc .uj-metric-value {\n      font-size: 1.5rem;\n      font-weight: 700;\n      font-family: \"SF Mono\", \"Cascadia Code\", \"Consolas\", monospace;\n      margin-top: 0.2rem;\n      transition: color var(--uj-transition);\n      color: var(--uj-text);\n    }\n\n    .uj-calc .uj-metric.uj-featured .uj-metric-value {\n      font-size: 2.25rem;\n      color: var(--uj-accent);\n    }\n\n    .uj-calc .uj-metric-sub {\n      font-size: 0.75rem;\n      color: var(--uj-text-muted);\n      margin-top: 0.15rem;\n    }\n\n    \/* Efficiency ring *\/\n    .uj-calc .uj-ring-wrap {\n      position: relative;\n      width: 72px;\n      height: 72px;\n      flex-shrink: 0;\n    }\n\n    .uj-calc .uj-ring-wrap svg {\n      transform: rotate(-90deg);\n    }\n\n    .uj-calc .uj-ring-bg {\n      fill: none;\n      stroke: var(--uj-border);\n      stroke-width: 6;\n    }\n\n    .uj-calc .uj-ring-fill {\n      fill: none;\n      stroke: var(--uj-accent);\n      stroke-width: 6;\n      stroke-linecap: round;\n      transition: stroke-dashoffset 0.5s ease, stroke var(--uj-transition);\n    }\n\n    \/* Animations *\/\n    @keyframes uj-fadeIn {\n      from { opacity: 0; transform: translateY(8px); }\n      to   { opacity: 1; transform: translateY(0); }\n    }\n\n    @keyframes uj-pulse {\n      0%, 100% { opacity: 1; }\n      50%       { opacity: 0.6; }\n    }\n\n    .uj-calc .uj-metric-value.uj-updating {\n      animation: uj-pulse 0.3s ease;\n    }\n  <\/style>\n<\/head>\n<body>\n\n  <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\n       Paste everything inside .uj-calc into WordPress.\n       Nothing outside this element is touched.\n  \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n  <div class=\"uj-calc\" id=\"ujCalc\">\n\n    <!-- Input Parameters -->\n    <section class=\"uj-card\" aria-label=\"Input parameters\">\n      <h2>Input Parameters<\/h2>\n\n      <div class=\"uj-field\">\n        <label for=\"uj-inputSpeed\">\n          <span>Input Speed (\u03c9<sub>in<\/sub>)<\/span>\n          <span class=\"uj-badge\" id=\"uj-speedBadge\">1000 RPM<\/span>\n        <\/label>\n        <input type=\"number\" id=\"uj-inputSpeed\" value=\"1000\" min=\"1\" max=\"50000\" step=\"10\">\n      <\/div>\n\n      <div class=\"uj-field\">\n        <label for=\"uj-jointAngle\">\n          <span>Operating Angle (\u03b2)<\/span>\n          <span class=\"uj-badge\" id=\"uj-angleBadge\">15\u00b0<\/span>\n        <\/label>\n        <div class=\"uj-slider-row\">\n          <input type=\"range\" id=\"uj-jointAngle\" min=\"0\" max=\"45\" step=\"0.5\" value=\"15\">\n          <input type=\"number\" id=\"uj-jointAngleNum\" min=\"0\" max=\"45\" step=\"0.5\" value=\"15\">\n        <\/div>\n      <\/div>\n\n      <div class=\"uj-field\">\n        <label for=\"uj-inputPower\">Transmitted Power (P)<\/label>\n        <div class=\"uj-unit-toggle\" role=\"group\" aria-label=\"Power unit\">\n          <button type=\"button\" class=\"uj-active\" data-unit=\"kW\">kW<\/button>\n          <button type=\"button\" data-unit=\"HP\">HP<\/button>\n        <\/div>\n        <input type=\"number\" id=\"uj-inputPower\" value=\"10\" min=\"0.01\" max=\"10000\" step=\"0.1\">\n      <\/div>\n\n      <div class=\"uj-field\">\n        <label>Bearing Friction Coefficient (k)<\/label>\n        <div class=\"uj-friction-presets\" role=\"group\" aria-label=\"Friction preset\">\n          <button type=\"button\" data-k=\"0.005\" class=\"uj-active\">Low<br><small>0.5%<\/small><\/button>\n          <button type=\"button\" data-k=\"0.0075\">Medium<br><small>0.75%<\/small><\/button>\n          <button type=\"button\" data-k=\"0.01\">High<br><small>1.0%<\/small><\/button>\n        <\/div>\n        <div class=\"uj-slider-row\">\n          <input type=\"range\" id=\"uj-frictionK\" min=\"0.003\" max=\"0.015\" step=\"0.0005\" value=\"0.005\">\n          <input type=\"number\" id=\"uj-frictionKNum\" min=\"0.003\" max=\"0.015\" step=\"0.0005\" value=\"0.005\">\n        <\/div>\n      <\/div>\n\n      <div class=\"uj-field\">\n        <label>System Configuration<\/label>\n        <div class=\"uj-config-toggle\">\n          <label>\n            <input type=\"radio\" name=\"uj-config\" value=\"single\" checked>\n            <span class=\"uj-cfg-icon\">\u2699<\/span>\n            Single Joint\n          <\/label>\n          <label>\n            <input type=\"radio\" name=\"uj-config\" value=\"dual\">\n            <span class=\"uj-cfg-icon\">\u2699\u2699<\/span>\n            Dual Joint (Phased)\n          <\/label>\n        <\/div>\n      <\/div>\n\n      <button class=\"uj-btn-calculate\" id=\"uj-btnCalculate\" type=\"button\">Calculate<\/button>\n    <\/section>\n\n    <!-- Calculated Results (hidden until Calculate clicked) -->\n    <div class=\"uj-results\" id=\"uj-results\">\n\n      <div class=\"uj-status uj-optimal\" id=\"uj-statusBanner\" role=\"alert\">\n        <span class=\"uj-status-icon\" id=\"uj-statusIcon\">\u2713<\/span>\n        <div>\n          <strong id=\"uj-statusTitle\">Optimal Operating Range<\/strong>\n          <div id=\"uj-statusMessage\">Operating angle is within the recommended 5\u00b0\u201320\u00b0 range for universal joints.<\/div>\n        <\/div>\n      <\/div>\n\n      <section class=\"uj-card\" aria-label=\"Calculated results\">\n        <h2>Calculated Results<\/h2>\n\n        <div class=\"uj-results-grid\">\n          <div class=\"uj-metric uj-featured\">\n            <div>\n              <div class=\"uj-metric-label\">Mechanical Efficiency (\u03b7)<\/div>\n              <div class=\"uj-metric-value\" id=\"uj-efficiency\">\u2014<\/div>\n              <div class=\"uj-metric-sub\" id=\"uj-efficiencySub\">Single joint estimate<\/div>\n            <\/div>\n            <div class=\"uj-ring-wrap\" aria-hidden=\"true\">\n              <svg width=\"72\" height=\"72\" viewBox=\"0 0 72 72\">\n                <circle class=\"uj-ring-bg\" cx=\"36\" cy=\"36\" r=\"30\"\/>\n                <circle class=\"uj-ring-fill\" id=\"uj-effRing\" cx=\"36\" cy=\"36\" r=\"30\"\n                  stroke-dasharray=\"188.5\" stroke-dashoffset=\"18.85\"\/>\n              <\/svg>\n            <\/div>\n          <\/div>\n\n          <div class=\"uj-metric\">\n            <div class=\"uj-metric-label\">Min Output Speed<\/div>\n            <div class=\"uj-metric-value\" id=\"uj-speedMin\">\u2014<\/div>\n            <div class=\"uj-metric-sub\">\u03c9<sub>out,min<\/sub> = \u03c9<sub>in<\/sub>\u00b7cos(\u03b2)<\/div>\n          <\/div>\n\n          <div class=\"uj-metric\">\n            <div class=\"uj-metric-label\">Max Output Speed<\/div>\n            <div class=\"uj-metric-value\" id=\"uj-speedMax\">\u2014<\/div>\n            <div class=\"uj-metric-sub\">\u03c9<sub>out,max<\/sub> = \u03c9<sub>in<\/sub>\/cos(\u03b2)<\/div>\n          <\/div>\n\n          <div class=\"uj-metric\">\n            <div class=\"uj-metric-label\">Speed Variation<\/div>\n            <div class=\"uj-metric-value\" id=\"uj-speedRipple\">\u2014<\/div>\n            <div class=\"uj-metric-sub\">\u00b1% from mean speed<\/div>\n          <\/div>\n\n          <div class=\"uj-metric\">\n            <div class=\"uj-metric-label\">Peak Fluctuation Factor<\/div>\n            <div class=\"uj-metric-value\" id=\"uj-fluctFactor\">\u2014<\/div>\n            <div class=\"uj-metric-sub\">(1 \u2212 cos\u00b2\u03b2) \/ cos(\u03b2)<\/div>\n          <\/div>\n\n          <div class=\"uj-metric\">\n            <div class=\"uj-metric-label\">Power Loss<\/div>\n            <div class=\"uj-metric-value\" id=\"uj-powerLoss\">\u2014<\/div>\n            <div class=\"uj-metric-sub\" id=\"uj-powerLossSub\">Heat dissipated at bearings<\/div>\n          <\/div>\n        <\/div>\n      <\/section>\n    <\/div>\n\n  <\/div><!-- \/.uj-calc -->\n\n  <script>\n  \/* ============================================================\n     Universal Joint Calculator\n     All queries scoped to #ujCalc \u2014 no global side-effects.\n  ============================================================ *\/\n  (function () {\n    'use strict';\n\n    const root = document.getElementById('ujCalc');\n    if (!root) return;\n\n    \/\/ Scoped query helpers\n    const $ = (sel) => root.querySelector(sel);\n    const $$ = (sel) => root.querySelectorAll(sel);\n\n    const els = {\n      inputSpeed:    $('#uj-inputSpeed'),\n      jointAngle:    $('#uj-jointAngle'),\n      jointAngleNum: $('#uj-jointAngleNum'),\n      inputPower:    $('#uj-inputPower'),\n      frictionK:     $('#uj-frictionK'),\n      frictionKNum:  $('#uj-frictionKNum'),\n      speedBadge:    $('#uj-speedBadge'),\n      angleBadge:    $('#uj-angleBadge'),\n      statusBanner:  $('#uj-statusBanner'),\n      statusIcon:    $('#uj-statusIcon'),\n      statusTitle:   $('#uj-statusTitle'),\n      statusMessage: $('#uj-statusMessage'),\n      efficiency:    $('#uj-efficiency'),\n      efficiencySub: $('#uj-efficiencySub'),\n      effRing:       $('#uj-effRing'),\n      speedMin:      $('#uj-speedMin'),\n      speedMax:      $('#uj-speedMax'),\n      speedRipple:   $('#uj-speedRipple'),\n      fluctFactor:   $('#uj-fluctFactor'),\n      powerLoss:     $('#uj-powerLoss'),\n      powerLossSub:  $('#uj-powerLossSub'),\n      btnCalculate:  $('#uj-btnCalculate'),\n      results:       $('#uj-results'),\n    };\n\n    let powerUnit = 'kW';\n    const HP_TO_KW = 0.7457;\n    const RING_C   = 2 * Math.PI * 30; \/\/ r=30\n\n    const deg2rad = (d) => d * Math.PI \/ 180;\n\n    function jointEfficiency(k, betaRad) {\n      return Math.max(0, (1 - k * Math.tan(betaRad)) * 100);\n    }\n\n    function powerToKw(v, unit) {\n      return unit === 'HP' ? v * HP_TO_KW : v;\n    }\n\n    function fmt(n, dec = 1) {\n      if (!isFinite(n)) return '\u2014';\n      return n.toLocaleString('en-US', {\n        minimumFractionDigits: dec,\n        maximumFractionDigits: dec,\n      });\n    }\n\n    function pulse(el) {\n      el.classList.remove('uj-updating');\n      void el.offsetWidth;\n      el.classList.add('uj-updating');\n    }\n\n    function updateStatus(angleDeg) {\n      const map = [\n        { test: (a) => a < 5,           cls: 'uj-warning', icon: '\u26a0',  title: 'Low Angle Warning',        msg: 'Risk of needle bearing brinelling \/ poor lubrication at angles below 5\u00b0. Ensure adequate articulation for proper grease circulation.' },\n        { test: (a) => a >= 5 && a <=20, cls: 'uj-optimal', icon: '\u2713',  title: 'Optimal Operating Range',  msg: 'Operating angle is within the recommended 5\u00b0\u201320\u00b0 range for universal joints.' },\n        { test: (a) => a > 20 && a <=30, cls: 'uj-caution', icon: '\u26a1', title: 'Caution \u2014 Elevated Angle',  msg: 'High speed fluctuation &#038; reduced bearing life expected. Monitor vibration and consider a dual-joint arrangement.' },\n        { test: (a) => a > 30,           cls: 'uj-danger',  icon: '\u26d4', title: 'Danger \u2014 Excessive Angle', msg: 'Angle exceeds 30\u00b0. Severe vibration, accelerated wear, and potential failure risk. Redesign strongly recommended.' },\n      ];\n      const cfg = map.find((c) => c.test(angleDeg)) || map[1];\n      els.statusBanner.className = 'uj-status ' + cfg.cls;\n      els.statusIcon.textContent    = cfg.icon;\n      els.statusTitle.textContent   = cfg.title;\n      els.statusMessage.textContent = cfg.msg;\n    }\n\n    function calculate() {\n      const wIn  = parseFloat(els.inputSpeed.value)  || 0;\n      const beta = parseFloat(els.jointAngle.value)  || 0;\n      const betaR = deg2rad(beta);\n      const k    = parseFloat(els.frictionK.value)   || 0.005;\n      const pKw  = powerToKw(parseFloat(els.inputPower.value) || 0, powerUnit);\n      const isDual = $('input[name=\"uj-config\"]:checked').value === 'dual';\n\n      \/\/ Show results\n      els.results.classList.add('uj-visible');\n\n      \/\/ Badges\n      els.speedBadge.textContent = fmt(wIn, 0) + ' RPM';\n      els.angleBadge.textContent = fmt(beta, 1) + '\u00b0';\n\n      const cosB  = Math.cos(betaR);\n      const wMin  = wIn * cosB;\n      const wMax  = wIn \/ cosB;\n      const ripple = isDual ? 0 : ((wMax - wMin) \/ (2 * wIn)) * 100;\n      const fluct  = isDual ? 0 : (1 - cosB * cosB) \/ cosB;\n\n      const etaSingle = jointEfficiency(k, betaR);\n      const eta = isDual ? Math.pow(etaSingle \/ 100, 2) * 100 : etaSingle;\n\n      const pLossKw = pKw * (1 - eta \/ 100);\n      const pLossW  = pLossKw * 1000;\n\n      updateStatus(beta);\n\n      els.efficiency.textContent    = fmt(eta, 2) + '%';\n      els.efficiencySub.textContent = isDual ? 'Dual joint (two joints in series)' : 'Single joint estimate';\n\n      els.speedMin.textContent   = isDual ? fmt(wIn, 1) + ' RPM' : fmt(wMin, 1) + ' RPM';\n      els.speedMax.textContent   = isDual ? fmt(wIn, 1) + ' RPM' : fmt(wMax, 1) + ' RPM';\n      els.speedRipple.textContent = isDual ? '\u00b10.0%' : '\u00b1' + fmt(ripple, 2) + '%';\n      els.fluctFactor.textContent = isDual ? '0.000' : fmt(fluct, 4);\n\n      els.powerLoss.textContent    = pLossW < 1000 ? fmt(pLossW, 1) + ' W' : fmt(pLossKw, 3) + ' kW';\n      els.powerLossSub.textContent = '(' + fmt(pLossW, 0) + ' W dissipated as heat)';\n\n      \/\/ Ring\n      els.effRing.style.strokeDashoffset = RING_C * (1 - eta \/ 100);\n      els.effRing.style.stroke = eta >= 95 ? 'var(--uj-success)' : eta >= 85 ? 'var(--uj-warning)' : 'var(--uj-danger)';\n\n      pulse(els.efficiency);\n    }\n\n    \/\/ Sync slider \u2194 number\n    function syncPair(rangeEl, numEl, cb) {\n      rangeEl.addEventListener('input', () => { numEl.value = rangeEl.value; cb && cb(); });\n      numEl.addEventListener('input', () => {\n        let v = parseFloat(numEl.value);\n        const mn = parseFloat(rangeEl.min), mx = parseFloat(rangeEl.max);\n        v = Math.min(mx, Math.max(mn, isNaN(v) ? mn : v));\n        numEl.value = rangeEl.value = v;\n        cb && cb();\n      });\n    }\n\n    syncPair(els.jointAngle, els.jointAngleNum, () => {\n      els.angleBadge.textContent = parseFloat(els.jointAngle.value).toFixed(1) + '\u00b0';\n    });\n    syncPair(els.frictionK, els.frictionKNum, () => {\n      $$('.uj-friction-presets button').forEach((b) => b.classList.remove('uj-active'));\n    });\n\n    els.inputSpeed.addEventListener('input', () => {\n      els.speedBadge.textContent = Math.round(parseFloat(els.inputSpeed.value) || 0) + ' RPM';\n    });\n\n    $$('.uj-friction-presets button').forEach((btn) => {\n      btn.addEventListener('click', () => {\n        const k = btn.dataset.k;\n        els.frictionK.value = els.frictionKNum.value = k;\n        $$('.uj-friction-presets button').forEach((b) => {\n          b.classList.toggle('uj-active', parseFloat(b.dataset.k) === parseFloat(k));\n        });\n      });\n    });\n\n    $$('.uj-unit-toggle button').forEach((btn) => {\n      btn.addEventListener('click', () => {\n        const newUnit = btn.dataset.unit;\n        if (newUnit === powerUnit) return;\n        const v = parseFloat(els.inputPower.value) || 0;\n        els.inputPower.value = (newUnit === 'kW' ? v * HP_TO_KW : v \/ HP_TO_KW).toFixed(2);\n        $$('.uj-unit-toggle button').forEach((b) => b.classList.remove('uj-active'));\n        btn.classList.add('uj-active');\n        powerUnit = newUnit;\n      });\n    });\n\n    els.btnCalculate.addEventListener('click', calculate);\n\n  })();\n  <\/script>\n\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>The Universal Joint Calculator is a free online engineering tool designed to help engineers, technicians, and machinery designers calculate the operating parameters of universal joints&#8230;<\/p>","protected":false},"author":2,"featured_media":24535,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8520],"tags":[8535,8534,3665,2537],"class_list":["post-24534","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-mechanical-basic-component-design","tag-drive-shaft","tag-joint-calculator","tag-power-transmission","tag-universal-joint","pmpro-has-access"],"acf":[],"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/07\/Universal-Joint-Calculator.png","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24534","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/comments?post=24534"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24534\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24535"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24534"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24534"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}